图论 欧拉回路
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<algorithm> #include<string> #include<cstring> #include<map> #include<stack> #include<set> #include<queue> using namespace std; typedef long long ll; #define me(x) memset(x, -1, sizeof(x)) #define mem(x) memset(x, 0, sizeof(x)) const int MOD = 1e18; const int N = 2e5 + 5; ll n, m; struct node { int u, v; }ed[N]; int id, vis[N], p[N], dep[N]; void add(int u, int v) { ed[id].u=u; ed[id].v=v; id++; } void ini() { id=0; mem(vis); mem(dep); for(int i=1; i<=n; i++) p[i]=i; } int Find(ll x) { int r=x; while(r!=p[r]) r=p[r]; int i=x, t; while(r!=p[i]) { t=p[i]; p[i]=r; i=t; } return r; } void join() { for(int i=0; i<id; i++) { int x=Find(ed[i].u), y=Find(ed[i].v); if(x!=y) p[x]=y; } } int main() { int i, j, k, x, l; int u, v, t; while(~scanf("%d", &n)) { if(!n) return 0; scanf("%d", &m); ini(); for(i=0; i<m; i++) { scanf("%d%d", &u, &v); add(u,v); add(v,u); dep[u]++, dep[v]++; } join(); k=-1; for(i=1; i<=n; i++) { k=Find(i); if(!i) m=k; else if(k!=m) break; } if(i<n) {cout<<0<<endl;continue;} k=0; for(i=1; i<=n; i++) { if(dep[i]%2) {k=1;break;} } if(!k)cout<<1<<endl; else cout<<0<<endl; } return 0; }