HDU-1878 判断无向图欧拉回路,水
Posted 掉血菜鸡煮熟中
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU-1878 判断无向图欧拉回路,水相关的知识,希望对你有一定的参考价值。
题意:问一个无向图是否存在欧拉回路。
总结:
1、一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图。
2、一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图。
3、要判断一个混合图G(V,E)(既有有向边又有无向边)是欧拉图,方法如下:
假设有一张图有向图G\',在不论方向的情况下它与G同构。并且G\'包含了G的所有有向边。那么如果存在一个图G\'使得G\'存在欧拉回路,那么G就存在欧拉回路。
// 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; }
以上是关于HDU-1878 判断无向图欧拉回路,水的主要内容,如果未能解决你的问题,请参考以下文章