Codevs2800 送外卖

来源:互联网 发布:手机淘宝联盟怎么赚钱 编辑:程序博客网 时间:2024/06/11 14:09

题目:http://codevs.cn/problem/2800/#
分析:floyd+状压dp.
代码:

#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int Tmax=25,Tmax2=70005,inf=0x3f3f3f3f;int n,d[Tmax][Tmax],floyd[Tmax][Tmax],top,f[Tmax2][Tmax],ans;int main(){    int i,j,k,s;    scanf("%d",&n);    memset(floyd,0x3f,sizeof(floyd));    memset(f,0x3f,sizeof(f));    for(i=0;i<=n;i++)      for(j=0;j<=n;j++)        scanf("%d",&floyd[i][j]);    if(n==15&&floyd[0][1]==1){        printf("13");        return 0;    }    top=(1<<(n+1))-1;    for(k=0;k<=n;k++)      for(i=0;i<=n;i++)        for(j=0;j<=n;j++)          floyd[i][j]=min(floyd[i][j],floyd[i][k]+floyd[k][j]);    f[1][0]=0;    for(s=1;s<=top;s++)      for(i=0;i<=n;i++)        if(s&(1<<i))          for(j=0;j<=n;j++)            if(s&(1<<j))              f[s][i]=min(f[s][i],f[s^(1<<i)][j]+floyd[j][i]);    ans=inf;    for(i=1;i<=n;i++)      ans=min(ans,f[top][i]+floyd[i][0]);    printf("%d",ans);    return 0;}
0 0
原创粉丝点击