题意:John买了新车,想开车去拜访他的朋友,已知每条街道上都恰巧有他的一个朋友,所以他想穿过每条街道一次并且回到起点。城镇上街道总数不超过1995,节点总数不超过44,任意一个节点所关联的街道总数不超过44,每一条街道所关联的两个节点都不同,每条街道的编号也不同。起点是第一次输入的两个节点中较小的那个。若存在多条回路,输出字典序最小的。
#include <iostream> using namespace std; #define MAXN 2000 #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) struct Edge { int st, ed; bool del; } edge[MAXN]; int stk[MAXN]; int deg[50]; int top, E, V; void find_path ( int now ) { for ( int i = 1; i <= E; i++ ) // 边从小到大取 { if ( ! edge[i].del && (edge[i].st == now || edge[i].ed == now) ) { edge[i].del = true; if ( edge[i].st == now ) find_path ( edge[i].ed ); else find_path ( edge[i].st ); stk[++top] = i; } } } int main() { int x, y, z, s; while ( 1 ) { scanf("%d%d",&x,&y); if ( x == 0 && y == 0 ) break; memset(deg,0,sizeof(deg)); s = min ( x, y ); E = top = 0; scanf("%d",&z); edge[z].st = x; edge[z].ed = y; edge[z].del = false; deg[x]++; deg[y]++; E = max ( E, z ); V = max ( V, max(x,y) ); while ( 1 ) { scanf("%d%d",&x,&y); if ( x == 0 && y == 0 ) break; scanf("%d",&z); edge[z].st = x; edge[z].ed = y; edge[z].del = false; deg[x]++; deg[y]++; E = max ( E, z ); V = max ( V, max(x,y) ); } int i; for ( i = 1; i <= V; i++ ) if ( deg[i] % 2 ) break; if ( i <= V ) printf("Round trip does not exist.\n"); else { find_path ( s ); for ( i = top; i >= 1; i-- ) printf("%d ",stk[i]); printf("\n"); } } return 0; }