首页 > 代码库 > POJ 1041 John's trip 无向图的【欧拉回路】路径输出
POJ 1041 John's trip 无向图的【欧拉回路】路径输出
欧拉回路第一题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 long11 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 edge21 memset(indegree, 0, sizeof(indegree));22 }23 24 int euler(int u){25 int i;26 for(i = 1; i <= n; ++i){// n represents edges27 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 casual47 n = n > w ? n : w;//get numbered largest edge48 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 solution60 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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。