题目描述
输入
村庄数n和各村之间的路程(均是整数)。
输出
样例输入
样例输出
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 int gi(){ 8 int str=0;char ch=getchar(); 9 while(ch>'9' || ch<'0')ch=getchar(); 10 while(ch>='0' && ch<='9')str=str*10+ch-48,ch=getchar(); 11 return str; 12 } 13 const int N=15; 14 int n;int dis[N][N];int F[N][1<<N]; 15 int main() 16 { 17 int x; 18 n=gi();int pp=(1<<n)-1,tmp; 19 for(int i=1;i<=n;i++) 20 for(int j=1;j<=n;j++) 21 dis[i][j]=gi(); 22 memset(F,127/3,sizeof(F)); 23 F[1][1]=0; 24 for(int k=1;k<=pp;k++) 25 { 26 for(int i=1;i<=n;i++) 27 { 28 if(!((1<<i-1)&k))continue; 29 for(int j=1;j<=n;j++) 30 { 31 if(j==i || (1<<j-1)&k || !dis[i][j])continue; 32 tmp=F[i][k]+dis[i][j]; 33 if(tmp<F[j][k|(1<<j-1)])F[j][k|(1<<j-1)]=tmp; 34 } 35 } 36 } 37 int ans=1999999999; 38 for(int i=2;i<=n;i++) 39 { 40 if(dis[i][1]==0)continue; 41 if(F[i][pp]+dis[i][1]<ans)ans=F[i][pp]+dis[i][1]; 42 } 43 printf("%d",ans); 44 return 0; 45 }