题解

1 条题解

  • 0
    @ 2017-10-09 20:46:37

    Very thanks to Dicboust!
    #include <bits/stdc++.h>
    using namespace std;
    int n,ans=99999999;
    int s[16][16];
    int f[1<<16][16];
    int Min(int x,int y)
    {
    if(x==-1) return y;
    if(y==-1) return x;
    return x<y? x:y;
    }
    main()
    {
    int i,j,k;
    cin>>n;
    n++;
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    cin>>s[i][j];
    for(k=0;k<n;k++)
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    s[i][j]=min(s[i][j],s[i][k]+s[k][j]);
    memset(f,-1,sizeof(f));
    f[1][0]=0;
    for(i=1;i<(1<<n);i++)
    for(j=0;j<n;j++)
    if(f[i][j]!=-1)
    for(k=0;k<n;k++)
    if(!(i&(1<<k)))
    {
    f[i|(1<<k)][k]=Min(f[i|(1<<k)][k],f[i][j]+s[j][k]);
    if((i|(1<<k))==(1<<n)-1)
    ans=min(ans,f[i|(1<<k)][k]+s[k][0]);
    }
    cout<<ans;
    return 0;
    }
    Randle
    #include<bits/stdc++.h>
    inline const void read(int &a)
    {
    a=0;char c=getchar();
    while(c<'0'||c>'9')c=getchar();
    while(c>='0'&&c<='9')
    {
    a=(a<<1)+(a<<3)+c-'0';
    c=getchar();
    }
    }
    int n,len[16][16],dis[16][1<<16];
    bool in_que[16][1<<16];
    struct queue
    {
    int que[100000],cond[100000],start,end;
    inline const void init(){start=0;end=-1;}
    inline const bool empty(){if(start>end)return true;return false;}
    inline const void push(int a,int b){que[++end]=a;cond[end]=b;}
    inline const void pop(){in_que[que[start]][cond[start]]=false;start++;}
    inline const int front_que(){return que[start];}
    inline const int front_cond(){return cond[start];}
    }path;
    void spfa()
    {
    while(!path.empty())
    {
    int k=path.front_que(),p=path.front_cond();
    if(dis[0][p]>dis[k][p]+len[k][0])
    {

    dis[0][p]=dis[k][p]+len[k][0];
    if(!in_que[0][p])
    {
    path.push(0,p);
    in_que[0][p]=true;
    }
    }
    for(int i=1;i<=n;i++)
    {
    if(dis[i][p|1<<i-1]>dis[k][p]+len[k][i])
    {

    dis[i][p|(1<<i-1)]=dis[k][p]+len[k][i];
    if(!in_que[i][p|(1<<i-1)])
    {
    path.push(i,p|(1<<i-1));
    in_que[i][p|(1<<i-1)]=true;
    }
    }
    }
    path.pop();
    }
    }
    int main()
    {
    path.init();
    memset(in_que,false,sizeof(in_que));
    read(n);
    for(int i=0;i<=n;i++)
    for(int j=0;j<=n;j++)read(len[i][j]);
    memset(dis,0x7f,sizeof(dis));
    dis[0][0]=0;path.push(0,0);in_que[0][0]=true;
    spfa();
    std::cout<<dis[0][(1<<n)-1];
    return 0;
    }

  • 1

信息

难度
7
分类
(无)
标签
(无)
递交数
30
已通过
8
通过率
27%
上传者