HDU 1878 欧拉回路
最简单的欧拉回路了,如果结点的出度入度之和不是2的倍数,那么就不是欧拉回路。注意要判断图是否连通。
#include <vector> #include <list> #include <map> #include <set> #include <queue> #include <deque> #include <stack> #include <algorithm> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cstdlib> #include <cstring> #include <queue> #include <cmath> using namespace std; #define pii pair<int,int> #define clr(a) memset((a),0,sizeof (a)) #define rep(i,a,b) for(int i=(a);i<=(int)(b);i++) #define per(i,a,b) for(int i=(a);i>=(int)(b);i--) #define inf 0x3f3f3f3f #define eps 1e-6 #define MAXN 1<<20 #define MAXM 100000007 #define MOD 1000000007 #define debug puts("reach here") #define MP make_pair #define PB push_back #define RI(x) scanf("%d",&x) #define RII(x,y) scanf("%d%d",&x,&y) #define RIII(x,y,z) scanf("%d%d%d",&x,&y,&z) typedef long long LL; int g[MAXN]; int n, m; int f[MAXN]; int h[MAXN]; int r[MAXN]; vector<int> vs[MAXN]; void init() { clr(g); clr(h); rep(i,0,n) f[i] = i, vs[i].clear(); } int find(int x) { return f[x] == x ? x : (f[x] = find(f[x])); } void union_set(int a, int b) { int x = find(a); int y = find(b); f[x] = y; } int main() { int a, b; while(RII(n, m) != EOF) { init(); rep(i,1,m) { RII(a, b); g[a]++; g[b]++; union_set(a, b); } rep(i,1,n) find(i); int k = 0; rep(i,1,n) { if(!h[f[i]]) { h[f[i]] = ++k; r[k] = f[i]; vs[k].PB(i); } else vs[h[f[i]]].PB(i); } int cnt = 0; rep(i,1,k) { int tmp = 0; int num = vs[i].size(); rep(j,0,num-1) tmp += g[vs[i][j]]&1; if(tmp == 0 && num != 1) cnt++; else cnt += tmp / 2; } printf("%d\n", cnt); } return 0; }