题目描述
【题意】 某乡有n个村庄( 1 < n < 15),有一个售货员, 他要到各个村庄去售货,各村庄之间的路程s(0 < s < 1000 ) 是已知的,且A村到B村与B村到A村的路大多不同。 为了提高效率,他从商店出发到每个村庄一次, 然后返回商店所在的村,假设商店所在的村庄为1, 他不知道选择什么样的路线才能使所走的路程最短。 请你帮他选择一条最短的路。 【输入格式】 村庄数n和各村之间的路程(均是整数)。 【输出格式】 最短的路程。 【样例输入】 3 0 2 1
1 0 2 2 1 0 【样例输出】 3 【数据解释】 3 {村庄数} 0 2 l {村庄1到各村的路程} 1 0 2 {村庄2到各村的路程} 2 1 0 {村庄3到各村的路程}
AC CODE:
#include <bits/stdc++.h> using namespace std; #define max 0xFFFFFF int n; int x[25]; int bestx[25]; int bestc; int cc; int a[25][25]; void swap(int &a,int &b) { int tep = a; a=b; b=tep; } void dfs(int i) { int j; if(i==n) { if(a[x[n-1]][x[n]]<max&&a[x[n]][1]<max&&(bestc==max||cc+a[x[n-1]][x[n]]+a[x[n]][1]<bestc)) { for(j=1; j<=n; j++) bestx[j]=x[j]; bestc=cc+a[x[n-1]][x[n]]+a[x[n]][1]; } } else { for(j=i; j<=n; j++) if(a[x[i-1]][x[j]]<max&&(bestc==max||cc+a[x[i-1]][x[j]]<bestc)) { swap(x[i],x[j]); cc+=a[x[i-1]][x[i]]; dfs(i+1); cc-=a[x[i-1]][x[i]]; swap(x[i],x[j]); } } } int tsp() { int i; for(i=1; i<=n; i++) x[i]=i; bestc = max; cc=0; dfs(2); return bestc; } int main() { cin>>n; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) cin>>a[i][j]; cout<<tsp()<<endl; return 0; }