题目链接
思路
对于每一个连通图,如果不含度数为奇数的点则可以判定为欧拉回路,只需要一组人就可以;对含有奇数度的点,则需要奇数度的点的个数/2
组人才能完成游历;
code
#include <iostream> #include <cstring> #include <fstream> using namespace std; const int MAX = 100000+5; int f[MAX], in[MAX], g[MAX]; int find(int x) { if(f[x] != x) { f[x] = find(f[x]); } return f[x]; } void unit(int x, int y) { x = find(x); y = find(y); f[y] = x; } int main(){ std::ios::sync_with_stdio(false); std::cin.tie(0); //ifstream cin("data.in"); int n, m; while(cin >> n >> m) { memset(in, 0, sizeof(in)); memset(g, 0, sizeof(g)); for(int i = 1; i <= n; ++ i) { f[i] = i; } while(m--) { int a, b; cin >> a >> b; if(a != b) {//当终点和起点相同时忽略 in[a] ++; in[b] ++; unit(a, b); } } int ans = 0; for(int i = 1; i <= n; ++ i) { if(in[i] & 1) { //出现奇数度的点时,在其连通分量上记录 g[find(i)] ++; } } for(int i = 1; i <= n; ++ i) { if(f[i] == i && in[i] > 0) { if(g[i] == 0) { //欧拉回路 ans ++; } else { //非欧拉回路 ans += g[i] / 2; } } } cout << ans << endl; } return 0; }