旅行售貨員問題 回溯法 與 01揹包的區別
阿新 • • 發佈:2019-02-05
#include<stdio.h>//01揹包回溯法是拿一個少一個,順序無關,屬於子集樹 #include<string.h>//售貨員問題是與順序有關,屬於排列樹,用一個標誌陣列標誌就可以 #define MAX_INT 1000; int mg[100][100],final[100],dis=0,totaldis=1000,n; void TSP(int s,int t,int fs) { if(t==n) { if(dis+mg[s][fs]<totaldis) { totaldis=dis+mg[s][fs]; return ; } } final[s]=1; for(int i=1;i<=n;i++) { if(i!=s&&!final[i]&&mg[s][i]+dis<totaldis) { dis+=mg[s][i]; TSP(i,t+1,fs); dis-=mg[s][i]; } } final[s]=0; } int main() { int i,j,sta; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%d",&mg[i][j]); } } scanf("%d",&sta); TSP(sta,1,sta); printf("%d\n",totaldis); memset(mg,0,sizeof(mg)); memset(final,0,sizeof(final)); dis=0,totaldis=0; } return 0; } /* 4 1000 30 1 3 30 1000 2 4 1 2 1000 60 3 4 60 1000 1 答案:10 */