一本通1530 Ant Trip
1530:Ant Trip
【题目描述】
原题来自:2009 Multi-University Training Contest 12 - Host by FZU
给你无向图的 N 个点和 M 条边,保证这 M 条边都不同且不会存在同一点的自环边,现在问你至少要几笔才能所有边都画一遍。(一笔画的时候笔不离开纸)
【输入】
多组数据,每组数据用空行隔开。
对于每组数据,第一行两个整数 N,M 表示点数和边数。接下去 M 行每行两个整数 a,b,表示 a,b 之间有一条边。
【输出】
对于每组数据,输出答案。
【输入样例】
3 3
1 2
2 3
1 3
4 2
1 2
3 4
【输出样例】
1
2
【提示】
数据范围与提示:
1≤N≤10^5,0≤M≤2×10^5,1≤a,b≤N
统计一张不一定联通的无向图中欧拉路径数量
sol:用并查集维护联通性,一个联通块中的数量就是其中奇点个数/2,如果没有就是1
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=100005; 4 int n,m; 5 int Deg[N],Jidian[N],Father[N]; 6 bool Used[N]; 7 inline int Get_Father(int x) 8 { 9 return (Father[x]==x)?(x):(Father[x]=Get_Father(Father[x])); 10 } 11 int main() 12 { 13 // freopen("ant.in","r",stdin); 14 // freopen("my.out","w",stdout); 15 int i; 16 while(~scanf("%d%d",&n,&m)) 17 { 18 for(i=1;i<=n;Father[i]=i,Used[i]=Deg[i]=Jidian[i]=0,i++); 19 for(i=1;i<=m;i++) 20 { 21 int x,y; 22 scanf("%d%d",&x,&y); 23 Deg[x]++; 24 Deg[y]++; 25 int xx=Get_Father(x),yy=Get_Father(y); 26 if(xx==yy) continue; 27 Father[xx]=yy; 28 } 29 for(i=1;i<=n;i++) 30 { 31 Jidian[Father[i]=Get_Father(i)]+=(Deg[i]&1); 32 } 33 int ans=0; 34 for(i=1;i<=n;i++) if(Father[i]==i) 35 { 36 if(!Deg[i]) continue; 37 if(!Jidian[i]) ans++; 38 else ans+=(Jidian[i]>>1); 39 } 40 printf("%d\n",ans); 41 } 42 return 0; 43 } 44 /* 45 input 46 3 3 47 1 2 48 2 3 49 1 3 50 4 2 51 1 2 52 3 4 53 output 54 1 55 2 56 */
河田は河田、赤木は赤木……。
私は誰ですか。教えてください、私は誰ですか。
そうだ、俺はあきらめない男、三井寿だ!