旅行售货员问题(回溯法)
2011-05-22 19:50
253 查看
题目描述我就不说了,但是给几个测试用例
input
4
-1 30 6 4
30 -1 5 10
6 5 -1 20
4 10 20 -1
output
25
input
7
-1 -1 -1 5 10 -1 -1
-1 -1 -1 -1 -1 3 -1
-1 -1 -1 -1 -1 -1 2
-1 8 -1 -1 -1 -1 -1
-1 -1 3 -1 -1 -1 -1
-1 -1 -1 -1 1 -1 -1
9 -1 -1 -1 -1 -1 -1
output
31
input
4
-1 30 6 4
30 -1 5 10
6 5 -1 20
4 10 20 -1
output
25
input
7
-1 -1 -1 5 10 -1 -1
-1 -1 -1 -1 -1 3 -1
-1 -1 -1 -1 -1 -1 2
-1 8 -1 -1 -1 -1 -1
-1 -1 3 -1 -1 -1 -1
-1 -1 -1 -1 1 -1 -1
9 -1 -1 -1 -1 -1 -1
output
31
//旅行售货员问题 #include<iostream> #define MAXSIZE 100 using namespace std; int n; int graph[MAXSIZE][MAXSIZE]; int c=0; int bestc=0; int x[MAXSIZE]; int bestx[MAXSIZE]; void backtrack(int k); void swap(int &a,int &b); int main(void) { cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>graph[i][j]; } } for(int i=1;i<=n;i++) { x[i]=i; bestx[i]=i; } backtrack(2); cout<<bestc<<endl; for(int i=1;i<=n;i++) { cout<<bestx[i]<<' '; } cout<<1<<endl; return 0; } void swap(int &a,int &b) { int temp=a; a=b; b=temp; } void backtrack(int k) { if(k==n) { if( (c+graph[x[n-1]][x ]+graph[x ][1]<bestc||bestc==0) && graph[x[n-1]][x ]!=-1 && graph[x ][1]!=-1 ) { bestc=c+graph[x[n-1]][x ]+graph[x ][1]; for(int i=1;i<=n;i++) { bestx[i]=x[i]; } } return ; } else { for(int i=k;i<=n;i++) { if( graph[x[k-1]][x[i]]!=-1 && (c+graph[x[k-1]][x[i]]<bestc || bestc==0)) { swap(x[i],x[k]); c+=graph[x[k-1]][x[k]]; backtrack(k+1); c-=graph[x[k-1]][x[k]]; swap(x[i],x[k]); } } } }
相关文章推荐
- 旅行售货员问题(回溯法搜索排列树)
- 算法java实现--回溯法--旅行售货员问题--排列树
- C语言使用回溯法解旅行售货员问题与图的m着色问题
- 旅行售货员问题-回溯法
- 旅行售货员问题 回溯法 与 01背包的区别
- 旅行售货员问题(回溯法实现)
- 回溯算法;旅行售货员问题;排列树;需要访问的是各个地点,不是路径;第一个排列点是出发点;O(n!)
- 旅行售货员问题的回溯法求解
- 回溯子集树与排列树——装载问题&旅行售货员问题(算法设计课题)
- 双调旅行售货员问题
- 【dp】双调旅行售货员问题
- 回溯法_旅行售货员问题
- 旅行售货员(回溯法)
- 算法java实现--分支限界法--旅行售货员问题
- 旅行售货员问题
- 旅行售货员问题(c++)
- 旅行售货员问题1
- 旅行售货员问题--c语言
- 旅行售货员问题
- 旅行售货员问题