1530:Ant Trip

【题目描述】

原题来自:2009 Multi-University Training Contest 12 - Host by FZU

给你无向图的  条边都不同且不会存在同一点的自环边,现在问你至少要几笔才能所有边都画一遍。(一笔画的时候笔不离开纸)

【输入】

多组数据,每组数据用空行隔开。

对于每组数据,第一行两个整数  之间有一条边。

【输出】

对于每组数据,输出答案。

【输入样例】

3 3
1 2
2 3
1 3

4 2
1 2
3 4

【输出样例】

1
2

【提示】

数据范围与提示:

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

相关文章:

  • 2021-12-26
  • 2021-12-06
  • 2022-12-23
  • 2021-06-08
  • 2021-11-25
  • 2022-12-23
  • 2022-01-27
  • 2021-09-23
猜你喜欢
  • 2022-12-23
  • 2021-06-18
  • 2021-05-26
  • 2021-05-27
  • 2021-07-11
  • 2022-12-23
  • 2021-05-31
相关资源
相似解决方案