TSP:旅行者问题(动态规划+递归)
// TSP.cpp : Defines the entry point for the console application. // #include "stdafx.h" typedef struct _node_st{ bool inPath ; int nextIndex; _node_st():inPath(false),nextIndex(-1){ } }Node,*NodePtr; #define MAX 6 int dis[MAX][MAX]={ 0, 10, 20, 30, 40, 50, 12, 0 ,18, 30, 25, 21, 23, 19, 0, 5, 10, 15, 34, 32, 4, 0, 8, 16, 45, 27, 11,10, 0, 18, 56, 22, 16,20, 12, 0 }; Node p[MAX]; void printPath(); //表示从begin开始,经过所有点后到达end的最小距离 int tsp(int beginIndex,int endIndex){ int result = 0xFFFFFFF; bool isLast = true; for(int i=0;i<MAX;i++){ if(i!=beginIndex){ if(!p[i].inPath){ isLast = false; p[i].inPath = true; int value = tsp(i,endIndex); if(dis[beginIndex][i]+value<result){ p[beginIndex].nextIndex = i; result = dis[beginIndex][i]+value; if(beginIndex==0&&endIndex==0){ printPath(); } } p[i].inPath = false; } } } if(isLast){ p[beginIndex].nextIndex = endIndex; return dis[beginIndex][endIndex]; } return result; } void printPath(){ int pre = 0,next; int count = MAX; while(count--){ next = p[pre].nextIndex; printf("%d->%d ",pre,next); pre = next; } printf("\n"); } int main(int argc, char* argv[]) { //freopen("i://out.txt","w",stdout); p[0].inPath = true; printf("%d\n",tsp(0,0)); return 0; }
躲猫猫社团团长 http://t.sina.com.cn/coolria