旅行售貨商問題 -- 回溯法
阿新 • • 發佈:2018-11-05
temp fine tput 初始 clu += put true lse
/*旅行售貨員問題回溯法*/ #include<stdio.h> #define N 4 int cc,//當前路徑費用 bestc;//當前最優解費用 int a[N+1][N+1];//鄰接矩陣,存放圖的信息 int bestx[N+1];//當前最優解 int x[N+1];//當前解 void inputAjac() { int i,j; printf("輸入大於0的值表示有邊,小於0表示無邊:\n"); for(i=1;i<=N;i++) { for(j=i+1;j<=N;j++) { printf("請輸入第%d個城市到第%d個城市所需路費為:",i,j); scanf("%d",&a[i][j]); a[j][i]=a[i][j]; } } } void backtrack(int i) { if(i==N) { if(a[x[N-1]][x[N]]>0&&a[x[N]][x[1]]>0) { if(bestc<0||bestc>cc+a[x[N-1]][x[N]]+a[x[N]][x[1]]) { int j; for(j=1;j<=N;j++) { bestx[j]=x[j]; bestc=cc+a[x[N-1]][x[N]]+a[x[N]][x[1]]; } } } } else { int j; for(j=i;j<=N;j++) { if(a[x[i-1]][x[j]]>0) { if(bestc<0||bestc>cc+a[x[i-1]][x[j]]+a[x[j]][x[1]]) { int temp; cc+=a[x[i-1]][x[j]]; temp=x[i]; x[i]=x[j]; x[j]=temp; backtrack(i+1); temp=x[i]; x[i]=x[j]; x[j]=temp; cc-=a[x[i-1]][x[j]]; } } } } } int tsp() { //初始化 int i; for(i=1;i<=N;i++) { x[i]=i; } cc=0,bestc=-1; inputAjac(); backtrack(2); return bestc; } void output() { int i; for(i=1;i<=N;i++) { printf("%4d",bestx[i]); } printf("%4d",bestx[1]); printf("\n"); } void main() { printf("走%d個城市最少路費為:%d",N,tsp()); printf("\n"); printf("走法為:"); output(); }
旅行售貨商問題 -- 回溯法