hdu 1878 欧拉回路+并查集
欧拉回路: 通过图中每条边且只通过一次,并且经过每一顶点的回路。
无向图欧拉回路的判定:图连通;图中所有节点度均为偶数
有向图欧拉回路的判定:图连通;所有节点入度等于出度
这道题属于无向图,首先用并查集判断图的联通性,各点的度数用一个数组保存下来。
如果一个点的根结点和其他点的根结点不同,则图不联通,有点度数为奇数也不满足欧拉回路,则输出0,否则输出1。
1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #include<vector> 5 6 using namespace std; 7 8 int n,m; 9 const int MAX_N=10005; 10 int pre[MAX_N]; 11 int iin[MAX_N]; 12 13 void init() 14 { 15 for(int i = 0; i <= n; i++) 16 { 17 pre[i]=i; 18 iin[i]=0; 19 } 20 } 21 22 int find_root(int x) 23 { 24 int r = x; 25 while(r!=pre[r]) 26 r = pre[r]; 27 28 int i = x,j; 29 while(i!=r) 30 { 31 j = pre[i]; 32 pre[i] = r; 33 i = j; 34 } 35 return r; 36 } 37 void join(int x,int y) 38 { 39 int xx = find_root(x); 40 int yy = find_root(y); 41 if(xx!=yy) 42 pre[xx]=yy; 43 } 44 int main() 45 { 46 while(cin>>n>>m,n) 47 { 48 int a,b; 49 init(); 50 for(int i = 1; i <= m; i++) 51 { 52 cin>>a>>b; 53 iin[a]++; 54 iin[b]++; 55 join(a,b); 56 } 57 int temp = find_root(1); 58 int flag = 1; 59 for(int i = 1; i <= n; i++) 60 { 61 if(iin[i]%2 || find_root(i)!=temp) 62 { 63 flag = 0; 64 break; 65 } 66 } 67 if(flag) 68 cout<<1<<endl; 69 else 70 cout<<0<<endl; 71 } 72 return 0; 73 }