题目链接点击: HihoCoder - 1176
欧拉路:
- 无向图存在欧拉路,当且仅当该图只存在 2个或者0个(0个即欧拉回路) 点为的度(入度+出度)为奇数,且该图是连通图。(本题判断条件+并查集找根)
- 有向图存在欧拉路,当且仅当 两个点度为奇数(一个入度比出度少1,,另一个反之),其他所有顶点的入度等于出度,且该图是连通图。
欧拉回路:
- 无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图。
- 有向图存在欧拉回路,当且仅当所有顶点的入度等于出度,且该图是连通图。
#include <bits/stdc++.h> using namespace std; const int maxn = 1e4+5; int du[maxn],fa[maxn]; int n,m,i,j,a,b; int Find(int x) { if(fa[x] == x) return x; return fa[x] = Find(fa[x]); } int main() { while(scanf("%d %d",&n,&m)!=EOF) { memset(du,0,sizeof du); for(i = 1; i <= n; i++) fa[i] = i; for(i = 0; i < m; i++) { scanf("%d %d",&a,&b); du[a]++; du[b]++; int a1 = Find(a),b1 = Find(b); if(a1!=b1) fa[a1] = b1; } int cnt = 0,cnt1 = 0; for(i = 1; i <= n; i++) { if(fa[i] == i) cnt1++; if(du[i] & 1) cnt++; } if((cnt == 2||cnt == 0)&&cnt1 == 1)//欧拉回路则从cnt = 0,cnt1就是根节点个数 printf("Full\n"); else printf("Part\n"); } return 0; }