这里先说一下欧拉图和欧拉回路的概念:
如果图G中的一个路径包括每个边恰好一次,则该路径称为欧拉路径(Euler path)。
如果一个回路是欧拉路径,则称为欧拉回路(Euler circuit)。
具有欧拉回路的图称为欧拉图(简称E图)。具有欧拉路径但不具有欧拉回路的图称为半欧拉图。
这就清楚好多了,然后下面是欧拉图的算法:fleury算法
这个算法的思想是,随机走过一条不是桥的边,走过之后就删掉。根据欧拉图的性质:
1.无向图G是欧拉图的充分必要条件是G 是连通图并且没有奇数度顶点
2.无向图G是半欧拉图的充分必要条件是G是连通的并且恰好有两个奇数度顶点.
3.有向图G是欧拉图的充分必要条件是图是强连通,并且每个定点的入度等于出度
4.有向图G是半欧拉图的充分必要条件是图单向连通并且恰好有两个奇数度顶点,这两个奇数度顶点一个的出度比入度大1,一个刚好反过来,其余的顶点的出度等于入度
我们可以找到根节点,然后我们就跑算法就ok了
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #include<stack> 7 using namespace std; 8 int n,m; 9 stack<int>s; 10 const int N = 200000; 11 int C[600][600]; 12 int ind[N]; 13 int head[N],tot; 14 void dfs(int x) 15 { 16 for(int v=1; v<=n; v++) 17 if(C[x][v]) 18 { 19 C[x][v]--; 20 C[v][x]--; 21 dfs(v); 22 } 23 s.push(x); 24 } 25 int main() 26 { 27 scanf("%d",&m); 28 for(int i=1; i<=m; i++) 29 { 30 int a,b; 31 scanf("%d%d",&a,&b); 32 n=max(max(a,b),n); 33 C[a][b]++; 34 C[b][a]++; 35 ind[a]++; 36 ind[b]++; 37 } 38 int root=1; 39 for(int i=1; i<=n; i++) 40 if(ind[i]%2==1) 41 { 42 root=i; 43 break; 44 } 45 dfs(root); 46 while(!s.empty()) 47 { 48 printf("%d ",s.top()); 49 s.pop(); 50 } 51 }