HDOJ 3018 - Ant Trip 判断一个无向图由由多少个欧拉(通/回)路构成..注意没有边的点不考虑..
2013-08-27 16:43
483 查看
题意:
给一个无向图..问由最少可以分解成多少个欧拉(通/回)路
题解:
我是觉得首先要找出每一个联通块..在一个联通块中..两个奇数度的点可以构一条通路...虽然不知道怎么证明..感觉上在一个联通块上最少需要的一笔画为其max(1,其奇数度点数/2)...1是因为若此联通块没有奇数度点..也要画一条欧拉回路把该联通块所有边覆盖...
直觉还是挺正确的..也是多画了几个图观察出来的..但是有个trick...有些点是独立的..没有边..处理的时候注意.就无视这些点..而不要把这些点也看成联通块了...
Program:
给一个无向图..问由最少可以分解成多少个欧拉(通/回)路
题解:
我是觉得首先要找出每一个联通块..在一个联通块中..两个奇数度的点可以构一条通路...虽然不知道怎么证明..感觉上在一个联通块上最少需要的一笔画为其max(1,其奇数度点数/2)...1是因为若此联通块没有奇数度点..也要画一条欧拉回路把该联通块所有边覆盖...
直觉还是挺正确的..也是多画了几个图观察出来的..但是有个trick...有些点是独立的..没有边..处理的时候注意.就无视这些点..而不要把这些点也看成联通块了...
Program:
#include<iostream> #include<stdio.h> #include<string.h> #include<cmath> #include<queue> #include<stack> #include<set> #include<time.h> #include<map> #include<algorithm> #define ll long long #define eps 1e-5 #define oo 1000000007 #define pi acos(-1.0) #define MAXN 100005 #define MAXM 500005 using namespace std; int d[MAXN],father[MAXN],F[MAXN],T[MAXN]; bool used[MAXN]; int getfather(int x) { if (father[x]==x) return x; return father[x]=getfather(father[x]); } int main() { int n,m,i,x,y,ans; while (~scanf("%d%d",&n,&m)) { memset(d,0,sizeof(d)); memset(used,false,sizeof(used)); for (i=1;i<=n;i++) father[i]=i; while (m--) { scanf("%d%d",&x,&y); d[x]++,d[y]++; used[x]=used[y]=true; father[getfather(x)]=getfather(y); } memset(F,0,sizeof(F)),m=0; for (i=1;i<=n;i++) if (used[i]) { if (!F[getfather(i)]) F[father[i]]=++m,T[m]=0; if (d[i]%2) T[F[father[i]]]++; } ans=0; for (i=1;i<=m;i++) ans+=max(1,T[i]/2); printf("%d\n",ans); } return 0; }
相关文章推荐
- HDU 3018 Ant Trip(欧拉路径 + 并查集 + 连通性判断)
- hdu-3018 Ant Trip(欧拉路径)
- HDOJ3018 Ant Trip(欧拉回路 + 并查集)
- HDU 3018 Ant Trip (欧拉路径)
- HDU 3018-Ant Trip(并查集&&欧拉)
- HDU 3018 Ant Trip(欧拉回路 欧拉通路,一笔画问题)
- 有2.5亿个整数存放在一个文件中,(已知内存容量没有此文件大)如何判断出这个文件中有多少个不相同的数。
- 这是一个求两数之和的题目,输入多对用空格分开的两个数a b,输出a+b的和,每一对数据的和占一行。编写代码时需要注意的是,由于没有指出有多少对输入数据,因此我们可以编写如下代码:
- 如何判断一个长字符串能否被一个数整除(注意:长字符串很长,不能转换为整数)
- GUI java.awt.Graphics类来画图 注意这里没有new一个Frame却直接launchFrame造了一个Frame
- 判断输入的一个整数有多少位是1,效率要高
- 判断一个字符串是否是有其他两个字符串交错构成的(Interleaving String)
- 如何判断一个公司可以付你多少钱?
- 写一个方法void triangle(int a,int b,int c),判断三个参数是否能构成一个三角形。如果不能则抛出异常IllegalArgumentException,显示异常信息:a,b,
- 判断一个数的二进制有多少个1
- 不同的取法输出顺序可以不考虑。取字符( 从标准输入读入一个由字母构成的串(不大于30个字符)。从该串中取出3个不重复的字符,求所有的取法。取出的字符,要求按字母升序排列成一个串。)
- ios map给一个经纬度的数组怎么能在连线后自动判断该缩放多少把线显示在最中间呢?
- 判断一个时间段内有多少个周末
- 一个很简单但是自己就没有注意的问题
- 1、判断一个数是否为素数,并求出1-1000中的全部素数(素数即质数,除1和自身以外没有其它因子,最小的质数是2)。