【BFS】 文化之旅

Come here--------

点击打开链接

#include"stdio.h"
#include"string.h"
struct construction
{
    bool tc[105];//bool td[105],在判断的时候以空间换时间//tc记录文化是否学习,td记录国家是否到达
    int now,sum;//now记录当前节点,sum记录当前路径长度
}q[50000];//模拟队列
int a[105][105],c[105],k,map[105][105],reflect[50000];
bool judge(int i,int j)
{
    for(int l=1;l<=k;l++)
        if(q[i].tc[l]&&a[c[j]][l]==1)
            return false;
    return true;
}
int main()
{
   // freopen("culture.in","r",stdin);
 //   freopen("culture.out","w",stdout);
    memset(map,-1,sizeof(map));
    int ans=-1,m,n,s,t,top=1,u,v;
    scanf("%d %d %d %d %d",&n,&k,&m,&s,&t);
    for(int i=1;i<=n;i++)
        scanf("%d",&c[i]);
    for(int i=1;i<=k;i++)
    {
        for(int j=1;j<=k;j++)
            scanf("%d",&a[i][j]);
        a[i][i]=1;
    }
    while(m--)
    {
        scanf("%d %d",&u,&v);
        scanf("%d",&map[u][v]);
        if(map[v][u]==-1||map[u][v]<map[v][u])
            map[v][u]=map[u][v];
    }
    reflect[0]=q[0].sum=0;
    q[0].now=s;
    q[0].tc[c[s]]=true;//=q[0].td[c[s]];
    for(int i=0;i<top;i++)
    {
        if(top>20000)
        {
            printf("-1");
            return 0;
        }
        if(q[reflect[i]].now==t)
        {
            ans=q[reflect[i]].sum;
            break;
        }
        for(int j=1;j<=n;j++)
            if(map[q[reflect[i]].now][j]!=-1&&judge(reflect[i],j))//&&!q[reflect[i].now].td[j]  //这个Judge is pretty great.
            {
                q[top].now=j;
                q[top].sum=q[reflect[i]].sum+map[q[reflect[i]].now][j];
                for(int l=1;l<=k;l++)
                    q[top].tc[l]=q[reflect[i]].tc[l];
               // for(int l=1;l<=n;l++)
               //     q[top].td[l]=q[reflect[i]].td[l];
                q[top].tc[c[j]]=true;
               // q[top].td[j]=true;
                reflect[top]=top++;//reflect调整节点搜索次序,使路径最短//beautiful
                for(int l=top-2;i<l&&q[reflect[l]].sum>q[reflect[l+1]].sum;l--)
                    m=reflect[l],reflect[l]=reflect[l+1],reflect[l+1]=m;//把路径最短的一个点调到最前面,可用优先队列优化
            }
    }
    printf("%d",ans);
    return 0;
}


猜你喜欢

转载自blog.csdn.net/C20181220_xiang_m_y/article/details/53034122
BFS