可行遍性——欧拉图and哈密顿图
可行遍性——欧拉图and哈密顿图
1.欧拉回路
欧拉回路:图G的一个回路,若他恰巧通过G中每条边一次,则称该回路为欧拉回路。欧拉回路就是就是从图上一点出发,经过所有的边且只经过一次,最终回到起点的路径。
1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 #include<map> 7 using namespace std; 8 const int maxv= 110; 9 const int maxe= 5010; //可能的最大值 10 11 struct ENode 12 { 13 int to; 14 int Next; 15 }; 16 ENode edegs[maxe]; 17 int Head[maxv], tnt; 18 void init() 19 { 20 memset(Head, -1, sizeof(Head)); 21 tnt= -1; 22 } 23 void Add_ENode (int a, int b) 24 { 25 ++ tnt; 26 edegs[tnt].to= b; 27 edegs[tnt].Next= Head[a]; 28 Head[a]= tnt; 29 ++ tnt; 30 edegs[tnt].to= a; 31 edegs[tnt].Next= Head[b]; 32 Head[b]= tnt; 33 } 34 35 int oLaData[maxe]; 36 int oLa_cnt; 37 bool visit[maxe]; 38 void oLa_dfs(int u) 39 { 40 for (int k= Head[u]; k!= -1; k= edegs[k].Next) 41 { 42 if (! visit[k]) 43 { 44 visit[k]= 1; //标记当前边已走过 45 visit[k^ 1]= 1; 46 oLa_dfs(edegs[k].to); 47 oLaData[oLa_cnt ++]= k; //回溯过程中记录边 48 } 49 } 50 } 51 52 int main() 53 { 54 int n; 55 /*建图*/ 56 /*判断欧拉回路是否存在*/ 57 oLa_dfs(1); 58 return 0; 59 }