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 */
来源:oschina
链接:https://my.oschina.net/u/4383622/blog/3656664