/*旅行售货员问题回溯法*/ #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(); }
原文地址:https://www.cnblogs.com/zili/p/9906422.html
时间: 2024-10-30 07:13:25