poj 1041 John's trip

/* Name: poj 1041 John's trip Author: UnimenSun Date: 21/05/11 15:04 Description: 欧拉回路 */ /* 解题报告: 欧拉回路: 欧拉回路时要判断图是否存在欧拉回路由于由题意可知图是连通的,因此只须判断图中结点的度数即可 无向图存在欧拉回路的条件为: 连通且不存在奇点 无向图存在欧拉路径的条件为: 连通且只存在两个奇点 有向图存在欧拉回路的条件为: 连通且所有结点的入度等于出度 有向图存在欧拉路径的条件为: 连通且只存在两个结点:其中一个入度比出度大1, 另一个入度比出度小1 对于有向图只需判断在去掉图的方向后的无向的图的连通性 该题注意思点: 由于存在重边所有在表示图的时候可以以边建,建立代码中的数据结构,存储以连接这条边 的两个结点即可 */ #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int maxnode = 50; const int maxedge = 2000; struct edge { int start; int end; }; edge ArrayEdge[maxedge]; int degree[maxnode]; int start; int NodeNum, EdgeNum; int anStack[maxedge], pIndex; int visited[maxedge]; bool Judge() { for(int i=1; i<=NodeNum; ++i) { if(degree[i]&1 != 0) { return false; } } return true; } void euler(int s) { for(int i=1; i<=EdgeNum; ++i) { if(!visited[i] && (ArrayEdge[i].start==s || ArrayEdge[i].end==s)) { visited[i] = 1; euler(ArrayEdge[i].start + ArrayEdge[i].end - s); anStack[pIndex++] = i; } } } int main() { int x, y, z; while(cin>>x>>y && (x!=0 || y!=0)) { NodeNum = 0; EdgeNum = 0; memset(degree, 0, sizeof(degree)); memset(visited, 0, sizeof(visited)); pIndex = 0; start = min(x, y); do { cin>>z; ArrayEdge[z].start = x; ArrayEdge[z].end = y; degree[x]++; degree[y]++; EdgeNum++; NodeNum = max(NodeNum, max(x, y)); }while(cin>>x>>y && (x!=0 || y!=0)); if(!Judge()) cout<<"Round trip does not exist."<<endl; else { euler(start); for(int i=EdgeNum-1; i>=1; --i) { cout<<anStack[i]<<" "; } cout<<anStack[0]<<endl; } } return 0; }

你可能感兴趣的:(poj 1041 John's trip)