欧拉回路第一题TVT
本题的一个小技巧在于:
【建立一个存放点与边关系的邻接矩阵】
1.先判断是否存在欧拉路径
无向图:
欧拉回路:连通 + 所有定点的度为偶数
欧拉路径:连通 + 除源点和终点外都为偶数
有向图:
欧拉回路:连通 + 所有点的入度 == 出度
欧拉路径:连通 + 源点 出度-入度=1 && 终点 入度 - 出度 = 1 && 其余点 入度 == 出度;
2.求欧拉路径 :
step 1:选取起点(如果是点的度数全为偶数任意点为S如果有两个点的度数位奇数取一个奇数度点为S)
step 2:对当前选中的点的所有边扩展,扩展条件(这条边为被标记),若可扩展 ->step 2;否则 step 3;
step 3:将次边计入path结果保存。
思路还是很清晰的。
贴代码了:
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <iostream> 6 #include <stack> 7 #include <queue> 8 #include <algorithm> 9 10 #define ll long long 11 using namespace std; 12 const int INF = 0x3f3f3f3f; 13 const int MAXN = 8000; 14 int vis[2000], indegree[50], map[50][2000], n; 15 stack <int> s; 16 17 void init(){ 18 n = 0; 19 memset(vis, 0, sizeof(vis)); 20 memset(map, 0, sizeof(map));//define the relationship between vertex and edge 21 memset(indegree, 0, sizeof(indegree)); 22 } 23 24 int euler(int u){ 25 int i; 26 for(i = 1; i <= n; ++i){// n represents edges 27 if(map[u][i] && !vis[i]){ 28 vis[i] = 1; 29 euler(map[u][i]); 30 s.push(i); 31 } 32 } 33 return 0; 34 } 35 36 int main(){ 37 int first, i, j, x, y, w; 38 while(cin >> x >> y){ 39 if(x == 0 && y == 0) break; 40 cin >> w; 41 init(); 42 map[x][w] = y; 43 map[y][w] = x; 44 ++indegree[x]; 45 ++indegree[y]; 46 first = x > y ? y : x;//get first vertex , but speacil judge as u casual 47 n = n > w ? n : w;//get numbered largest edge 48 while(true){ 49 cin >> x >> y; 50 if(!x && !y) 51 break; 52 cin >> w; 53 map[x][w] = y; 54 map[y][w] = x; 55 ++indegree[x]; 56 ++indegree[y]; 57 n = n > w ? n : w; 58 } 59 for(i = 1; i < 45; ++i)//judge if exists solution 60 if(indegree[i] % 2) break; 61 if(i < 45) 62 cout << "Round trip does not exist.\n"; 63 else{ 64 euler(first); 65 while(!s.empty()){ 66 cout << s.top() << ‘ ‘; 67 s.pop(); 68 } 69 cout << endl; 70 } 71 } 72 return 0; 73 }
POJ 1041 John's trip 无向图的【欧拉回路】路径输出,布布扣,bubuko.com
POJ 1041 John's trip 无向图的【欧拉回路】路径输出
原文:http://www.cnblogs.com/wushuaiyi/p/3890960.html