hdu 3018 Ant Trip 一笔画问题
2016-04-21 20:31
363 查看
题目链接
题意:给出n个村庄,m条路。Tony和朋友们想遍历所有的路,并且每条路只经过一次。问他们最少要分成几组。
一笔画问题。若一个连通子图的全都是偶节点,则分组+1。若有t个奇节点,则分组+t/2。
欧拉路的判断方法:奇节点的度为2或者0。
注意若一个点没有路与它相连,则不考虑它。
题意:给出n个村庄,m条路。Tony和朋友们想遍历所有的路,并且每条路只经过一次。问他们最少要分成几组。
一笔画问题。若一个连通子图的全都是偶节点,则分组+1。若有t个奇节点,则分组+t/2。
欧拉路的判断方法:奇节点的度为2或者0。
注意若一个点没有路与它相连,则不考虑它。
#include <iostream> #include<cstdio> #include<cstring> #include<cmath> #define N 110000 using namespace std; int pre ,v ,num ,p ; int findset(int v) { int t1,t2=v; while(v!=pre[v]) v=pre[v]; while(pre[t2]!=v) { t1=pre[t2]; pre[t2]=v; t2=t1; } return v; } void unions(int u,int v) { int t1=findset(u); int t2=findset(v); if(t1!=t2) pre[t1]=t2; } int main() { int n,m; while(~scanf("%d%d",&n,&m)) { for(int i=1;i<=n;i++) pre[i]=i; memset(num,0,sizeof(num)); memset(p,-1,sizeof(p)); for(int i=0;i<m;i++) { int a,b; scanf("%d%d",&a,&b); unions(a,b); num[a]++; num[b]++; } for(int i=1;i<=n;i++) { findset(i); if(p[pre[i]]==-1&&num[i]) p[pre[i]]=0; if(num[i]&1) p[pre[i]]++; } int ans=0; for(int i=1;i<=n;i++) { if(p[i]>0) ans+=p[i]/2; if(p[i]==0) ans++; } cout<<ans<<endl; } }
相关文章推荐
- CodeForces 552C-Vanya and Scales【思维】
- Scala进阶源码实战之六——类型变量
- 如何在Hdevelop加入自己的算子
- EditText中一些属性的用法
- 对正则表达式的理解
- 程序员装逼速成手册-----嘻嘻,感觉亮点在最后呀啦啦啦啦~~~
- Java 工程师成神之路
- Android 6.0权限管理,sdk>=23请求权限
- C++ primer 5th 习题之10.13
- Java的动态代理
- 初识Python
- 站立会议第四天
- 第一冲刺阶段站立会议05
- java中常见异常的结构和分类
- spring框架在开发中为我们做了哪些事?
- 测试作业
- 测试
- Android 发送短信
- Java中停止线程执行的方法
- 初次接触Xabber