hdu 3018 Ant Trip
2015-11-24 18:04
459 查看
问至少从几个点出发可以遍历所有的边且每条边仅访问一次。
先看看给定的图是几个联通块组成的,遍历的起点和终点肯定是度为奇数的点(除非这联通块是环)也就是遍历只能是u->v1->v2->v3->。。。。->vn(或者u->v1->v2->v3->。。。。->u),所以要统计每个联通块的度为奇数 的点的个数和度为偶数的点的个数,则ans=奇数 的点的个数/2+都是偶数的联通块的个数。
先看看给定的图是几个联通块组成的,遍历的起点和终点肯定是度为奇数的点(除非这联通块是环)也就是遍历只能是u->v1->v2->v3->。。。。->vn(或者u->v1->v2->v3->。。。。->u),所以要统计每个联通块的度为奇数 的点的个数和度为偶数的点的个数,则ans=奇数 的点的个数/2+都是偶数的联通块的个数。
#include<stdio.h> #include<string.h> #include<stack> #include<string> #include<math.h> #include<queue> #include<algorithm> #include<iostream> #include<vector> #include<map> using namespace std; #define LL long long #define inf 1<<30 #define mod 1000000007 #define N 100010 int n,m,even ,odd ; int f ,deg ; int Find(int x) { if(x!=f[x]) f[x]=Find(f[x]); return f[x]; } int main() { int i,j,u,v; while(scanf("%d%d",&n,&m)!=-1) { for(i=1;i<=n;i++)f[i]=i; memset(deg,0,sizeof(deg)); memset(even,0,sizeof(even)); memset(odd,0,sizeof(odd)); for(i=1;i<=m;i++) { scanf("%d%d",&u,&v); deg[u]++;deg[v]++; u=Find(u);v=Find(v); f[v]=u; } for(i=1;i<=n;i++) { if(deg[i]==0) continue; int p=Find(i); odd[p]+=(deg[i]%2==1); even[p]+=(deg[i]%2==0); } int ans=0; for(i=1;i<=n;i++) { if(odd[i]) { ans+=odd[i]/2; continue; } if(even[i]>0) ans++; } printf("%d\n",ans); } return 0; }
相关文章推荐
- crawler: 常用的一些工具
- 1-1-06:空格分隔输出
- android播放视频
- jQuery-1.9.1源码分析系列(十一) DOM操作
- __stdcall和__cdecl的区别
- Android 自定义TextView 自动换行
- Android开发 Handler引起的内存泄露
- IOS9.0 之后友盟分享详细过程
- 1-1-05:输出保留12位小数的浮点数
- 1-1-04:输出保留3位小数的浮点数
- Android ViewPager动画切换
- 基于bootstrap的select(可多选)
- 持续集成环境Jenkins详解
- Fullpage入门指南
- 30个php操作redis常用方法代码例子
- RecyclerView实现上拉加载,下拉刷新
- 关于eclipse闪退的解决方案
- 在已经排好序的线性表中插入一个数,还是升序
- javascript变量作用域
- POJ 2299 Ultra-QuickSort 【树状数组求逆序数】