void findPass(int v,int i,int *pass) { if(i==v) cout<<'v'<<v+1<<' '; //如果经过点为起点,输出 else { findPass(v,pass[i],pass);//否则,查找到此点的经过点 cout<<'v'<<i+1<<' '; //输出此点 } }
void printAnswer(){ int i, j, count; //printf("Test Case No:%d\n", number); fprintf(output,"Test Case No:%d\n",number++); for (i = 0; i <= K; i++){ if (PATH[M - 1][N - 1].count[i] == 0 || PATH[M - 1][N - 1].count[i] == 100000) { continue; } count = PATH[M - 1][N - 1].count[i]; //printf("k:%d count:%d cost:%d\n", i, count, PATH[M - 1][N - 1].cost[i]); fprintf(output, "k:%d count:%d cost:%d\n", i, count, PATH[M - 1][N - 1].cost[i]); findPass(i); } //printf("\n"); fprintf(output, "\n"); }
void ShortestPath(int v,int cost[][7],int dist[],const int n) { //v是起点,算出v到各点的最短路径 int s[n],min,i,j; int pass[n]; //起点到点i中间的途径点 for(i=0; i<=n; i++) { s[i]=0; //解集合 dist[i]=cost[v][i]; //记录起点到点i间的直接距离 pass[i]=v; //初始化不途径任何点 } s[v]=1; dist[v]=0; for(i=1; i<=n; i++) //共需寻找n-1条路径 { min=-1; for(j=0; j<=n; j++) //找到起点到未选点中距离最短的一个,用min标记其下标 { if(s[j]==0) { if(min==-1) min=j; else if (dist[j]<dist[min]) min=j; } } s[min]=1; printf("到点v%d的距离为%d,路径为 : ",min+1,dist[min]); findPass(v,pass[min],pass); cout<<'v'<<min+1<<endl; for(j=0; j<=n; j++) //经过min点是否会使起点到其他未选结点的路径变短? { if(s[j]==0&&dist[min]+cost[min][j] <dist[j]) { //比较两段之和与原路径哪个更短 dist[j]=dist[min]+cost[min][j]; pass[j]=min; //记录途经点min } } } cout<<"起点v"<<v+1<<"到各点的最短距离:"; for(j=0; j<=n; j++) //显示起点到各点的最短距离 cout<<dist[j]<<' '; cout<<endl; }
shared_ptr<RenderPass> Technique::getPass(const std::string &name) { return findPass(name); }