一本通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

【提示】

数据范围与提示:

1N10^5,0M2×10^5,1a,bN

 

统计一张不一定联通的无向图中欧拉路径数量

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 */
View Code

 

posted @ 2019-02-02 16:59  yccdu  阅读(351)  评论(0编辑  收藏  举报