【 CodeForces 209C】 【欧拉回路推结论+并查集计算联通分量】 【给定n点m边无向图,可能有自环和重边。 问最少添加多少条边后,使得图存在从点1出发发又回到点1的欧拉回路】
来源:互联网 发布:淘宝网的运营模式是() 编辑:程序博客网 时间:2024/05/21 07:50
传送门:C. Trails and Glades
描述:
题意:
给定n点m边无向图,可能有自环和重边。 问最少添加多少条边后,使得图存在从点1出发又回到点1的欧拉回路(所给的边要保证经过一次)。 n,m ≤ 106
思路:
利用欧拉回路存在的性质,先求出每个连通块内度数是奇数的点的个数。 我们需要加边 以消除所有奇度数点。 然后我们还得把所有连通块连通起来。 可以发现,如果一个连通块包含奇数度数点,那 么就不需要额外加边就能与其他连通块连通 (想象把这些连通块的奇数点收尾相连)。 但如果一个连通块里没有奇度数点,那么必须额外花费1条边才能把它与其他部分连接起 来。 于是答案是:
• 如果全图连通,则答案是奇数度数点的个数/2.
• 否则答案是奇数度数点的个数/2+不含奇数度数点的连通块的个数。
注意:
有一些细节要考虑。 注意孤立点的特殊处理(有没有自环,有的话需要当做联通分量连入图中,没有的话就还是孤立点)。
代码:
#include <bits/stdc++.h>#define pr(x) cout << #x << "= " << x << " " ;#define pl(x) cout << #x << "= " << x << endl;#define ll __int64using namespace std;template<class T> void read(T&num) { char CH; bool F=false; for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar()); for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar()); F && (num=-num);}int stk[70], tp;template<class T> inline void print(T p) { if(!p) { puts("0"); return; } while(p) stk[++ tp] = p%10, p/=10; while(tp) putchar(stk[tp--] + '0'); putchar('\n');}const int N=1e6+10;int p[N],deg[N];int flag[N];//是否含有奇数点的联通分量int vis[N];int n,m;int Find(int x){ return p[x]==x?x:p[x]=Find(p[x]);}void unite(int x,int y){ x=Find(x); y=Find(y); if(x!=y)p[y]=x;}int main(){ /* #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif*/ read(n);read(m); for(int i=1; i<=n; i++)p[i]=i; vis[1]=1; for(int i=1; i<=m; i++){ int u,v; read(u);read(v); if(u!=v){ deg[u]++; deg[v]++; vis[u]++; vis[v]++; unite(u, v); } else vis[u]++; } for(int i=1; i<=n; i++){ if(deg[i]&1){ flag[Find(i)]++; } } int tong=0,ans=0,k=0; for(int i=1; i<=n; i++){ if(vis[i] && Find(i)==i){ if(flag[i])ans+=flag[i]; else tong++; k++;//计算几个联通分量 } } if(k==1)print(ans/2);//全图连通 else print(ans/2+tong); return 0;}
0 0
- 【 CodeForces 209C】 【欧拉回路推结论+并查集计算联通分量】 【给定n点m边无向图,可能有自环和重边。 问最少添加多少条边后,使得图存在从点1出发发又回到点1的欧拉回路】
- CodeForces 209C Trails and Glades(欧拉回路判断+并查集计算联通分量)
- hdu1878 欧拉回路(无向图+并查集)
- hdu1878 欧拉回路(无向图存在欧拉回路,入门题)
- 有向图,无向图的欧拉回路和欧拉通路poj 2337
- 一个环,有n个点, 问从0点出发,经过k步回到原点有多少种方法
- 计蒜客 判定欧拉回路 (利用并查集实现有向图欧拉回路的判断)
- poj 2513 Colored Sticks (字典树+并查集+无向图的欧拉回路。)
- POJ 2230 - Watchcow 输出欧拉回路点的路径...
- 数据结构实验之图论八:欧拉回路 无向图的欧拉回路判断
- 无向图的边双联通分量,点双联通分量
- hdu1878欧拉回路【并查集】
- HDU1116(欧拉回路+并查集)
- 并查集+欧拉回路
- hdu3018并查集+欧拉回路
- 欧拉回路-并查集
- 并查集与欧拉回路
- UVa10129(欧拉回路,并查集)
- 1030 - Discovering Gold(概率DP?)
- linux端口被占用的查看和解决办法
- FTP 两种连接模式 (主动模式被动模式)
- handler用法
- Xcode 资源拷贝选项解析
- 【 CodeForces 209C】 【欧拉回路推结论+并查集计算联通分量】 【给定n点m边无向图,可能有自环和重边。 问最少添加多少条边后,使得图存在从点1出发发又回到点1的欧拉回路】
- Java-IO之PrintWriter(字符打印输出流)
- Canvas贪吃蛇
- 面向对象_多态的弊端
- HDU 5490 Simple Matrix(组合数学+构造等比数列)——2015 ACM/ICPC Asia Regional Hefei Online
- linux之shell变量
- ARP协议解析
- 手势识别(一)--手势基本概念和ChaLearn Gesture Challenge
- shell脚本——正则表达式