反向存图 dijstra 记录路径
奇怪的输入输出
输入:用字符串存最后一行
输出:\t 来水平制表
#include <iostream> #include <memory.h> #include <string> #include <stdio.h> #include <algorithm> #define IN (1<<28) using namespace std; struct node { int id; int dist; }; bool cmp( const node &a, const node &b ) { return a.dist < b.dist; } node des[25]; int N, G[25][25], path[25], src, dist[25]; int visited[25]; char str[500]; int k; void dij() { for( int i = 1; i <= N; i++ ) dist[i] = G[src][i]; dist[src] = 0; visited[src] = 1; while(1) { int MinV = 0, Min = IN; for( int i = 1; i <= N; i++ ) if( !visited[i] && dist[i] < Min ) { Min = dist[i]; MinV = i; } if( !MinV ) break; visited[MinV] = 1; for( int i = 1; i <= N; i++ ) { if( !visited[i] && dist[i] > Min + G[MinV][i] ) { dist[i] = Min + G[MinV][i]; path[i] = MinV; } } } } void PathPrint( int i ) { if( i==path[i] ) { printf("%d\t%d\n",i,src); return ; } printf("%d\t",i); PathPrint( path[i] ); } void Input() { printf("Org Dest Time Path\n"); for( int i = 1; i < k; i++ ) { printf("%d\t%d\t%d\t", des[i].id, des[0].id,des[i].dist ); if( des[i].id == des[0].id ) { printf("%d\n", des[0].id ); } else PathPrint(des[i].id); } } int main() { while( cin >> N ) { memset( G, 0, sizeof(G) ); memset( path, 0, sizeof(path) ); memset( visited, 0, sizeof(visited) ); memset( str, 0, sizeof(str) ); for( int i = 1; i <= N; i++ ) for( int j = 1; j <= N; j++ ) { cin >> G[j][i]; path[i] = i; if( G[j][i] == -1 ) G[j][i] = IN; } gets(str);//吸收换行符 gets(str); int t = 0; k = 0; for(int i=0; str[i]!='\0'; i++) { if(str[i]>='0'&&str[i]<='9') { t=t*10+str[i]-'0'; } else if(t!=0) { des[k++].id=t; t=0; } } if(t!=0) des[k++].id=t;//最后一个字符 src = des[0].id; dij(); for( int i = 0; i < k; i++ ) des[i].dist = dist[ des[i].id ]; sort( des+1, des + k, cmp); Input(); } return 0; }