题意:问一个无向图是否存在欧拉回路。
总结:
1、一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图。
2、一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图。
3、要判断一个混合图G(V,E)(既有有向边又有无向边)是欧拉图,方法如下:
假设有一张图有向图G',在不论方向的情况下它与G同构。并且G'包含了G的所有有向边。那么如果存在一个图G'使得G'存在欧拉回路,那么G就存在欧拉回路。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
// HDU-1878 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define F(i,a,b) for (int i=a;i<b;i++) #define FF(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f typedef long long ll; const int N = 1e3+10; int father[N]; int Find(int c) { int p=c,i=c,j; while(father[p]!=p) p=father[p]; while(father[i]!=p) { j=father[i], father[i]=p, i=j; } return p; } bool Unite(int u,int v) { int fau=Find(u), fav=Find(v); if(fau!=fav) { father[fav]=fau; return true; } return false; } int degree[N]; int main() { int n, m; while(scanf("%d", &n) && n) { scanf("%d", &m); mes(degree, 0); FF(i,1,n) father[i]=i; FF(i,1,m) { int u, v; scanf("%d%d", &u, &v); if(u!=v) { degree[u]++, degree[v]++; if(Unite(u, v)) ; } } int flag=0, cnt=0; FF(i,1,n) if(degree[i]&1) flag=1; FF(i,1,n) if(father[i]==i) cnt++; if(flag || cnt>1) puts("0"); else puts("1"); } return 0; }