UVA - 10972 RevolC FaeLoN

一道特别好的题qwq。
题目大意就是给你一个无向图,让你把边定向之后再加一些边使得这个图强连通,求最少需要加多少边。
一开始毫无头绪23333,数据范围让人摸不着头脑。。。。。
然后开始画图,,,发现环上的边都顺时针或者逆时针是很优的,之后扩展到了 边双联通分量上(因为边双联通分量中的每个边都在至少一个环中嘛):可以发现每个边双联通分量都存在一种边的定向方式,使得定向之后这个联通分量是强连通分量。
这个考虑一个个把环缩起来就行了吧。
于是我们先跑一遍 tarjan,把图中所有桥找出来,然后图中的边双就可以缩成一个点啦,此时这个图就缩成了一个森林,于是现在的问题就变成了:给你一个森林,求最少添加多少条边,使得图中不再存在割边(也就是合并所有边双)。
这时我猛然想起之前做过的一道题: http://www.cnblogs.com/JYYHH/p/8418923.html,有没有感觉很相似,只不过这个题不是树而是森林。。。。。
至于为什么一个树的最优方案是 (叶子数+1)/2 这里就不再解释了,那篇博客已经讲了。
然后我们需要把这个结论扩展成 => 一个森林的最优方案是 (叶子数 + 孤立顶点数*2 +1)/2.
考虑把所有树合并成一颗大树,其中连的边必须保证 两端都是 叶子或者孤立顶点,这样一条边会带来1的代价,并且使 叶子数 + 孤立顶点数*2 +1 这个值减少2。因为这样并不影响 叶子数 + 孤立顶点数*2 +1 的奇偶性,所以最后合并成一颗树之后再用之前的那个结论就行了。
#include<bits/stdc++.h>
#define ll long long
#define pb push_back
using namespace std;
const int maxn=1005;
int to[maxn*1000],ne[maxn*1000],num,dc,uu,vv,K,ans;
int hd[maxn],n,m,col[maxn],dfn[maxn],low[maxn],D[maxn];
bool ban[maxn*1000];
inline void add(int x,int y){ to[++num]=y,ne[num]=hd[x],hd[x]=num;} inline void init(){
fill(ban,ban+num+1,0),num=1;
memset(hd,0,sizeof(hd)),ans=0;
memset(col,0,sizeof(col));
memset(dfn,0,sizeof(dfn));
memset(D,0,sizeof(D));
} void dfs(int x,int fa){
dfn[x]=low[x]=++dc;
for(int i=hd[x];i;i=ne[i]){
if(to[i]==fa) continue;
if(!dfn[to[i]]){
dfs(to[i],x),low[x]=min(low[x],low[to[i]]);
if(low[to[i]]>dfn[x]) ban[i]=ban[i^1]=1;
}
else low[x]=min(low[x],dfn[to[i]]);
}
} void Search(int x){
col[x]=K;
for(int i=hd[x];i;i=ne[i]) if(!ban[i]&&!col[to[i]]) Search(to[i]);
} inline void calc(){
for(int i=0;i<=num;i++) if(ban[i]) D[col[to[i]]]++;
for(int i=1;i<=K;i++) if(D[i]<2) ans+=2-D[i];
} int main(){
while(scanf("%d%d",&n,&m)==2){
init(),dc=K=0;
for(int i=1;i<=m;i++) scanf("%d%d",&uu,&vv),add(uu,vv),add(vv,uu);
for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i,-1);
for(int i=1;i<=n;i++) if(!col[i]) K++,Search(i);
if(K==1) puts("0");
else calc(),printf("%d\n",(ans+1)>>1);
}
return 0;
}
UVA - 10972 RevolC FaeLoN的更多相关文章
- UVA 10972 - RevolC FaeLoN(边-双连通分量)
UVA 10972 - RevolC FaeLoN option=com_onlinejudge&Itemid=8&page=show_problem&category=547 ...
- UVA 10972 RevolC FaeLoN(边连通分量)
坑了我一天的题目..跑了20ms挂了,就知道有个小毛病= = 无向图转有向图判强连通. 首先要知道什么样的无向图可以转化为强连通图?连通分量(环)自然是可以的:那么扩大范围(存在割顶),发现点连通分量 ...
- uva 10972 RevolC FaeLoN cdoj 方老师和农场
//自己写的第一发tarjan 解:先进行双连通分解并缩点,分解后一定是一颗树,设叶节点个数为n那么答案就是(n+1)/2 关于双连通分量求解:在跑tarjan时判断每个点连向父节点的边是否是桥,如果 ...
- UVA 10972 RevolC FaeLoN(边-双连通+缩点)
很好的一道图论题,整整撸了一上午... 题意是给定一个无向图,要求将所有边变为有向边,求最少加入多少条有向边,使得该图强连通?这里先假设一个问题:给定一个无向子图,该子图具有怎样的性质才能使得将其无向 ...
- 【RevolC FaeLoN Uva 10972】
·无向图转有向图,经典而美妙. ·英文题,述大意: 输入一个无向图(不一定联通),现在询问:是否可以将每一条无向边定向,并为新图添加最少的新的有向边,使得原图强联通. ·分析: ...
- uva 10972(边双连通分量)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33804. 思路:和poj的一道题有点像,不过这道题图可能不连通,因 ...
- 【UVA10972】RevolC FaeLoN (求边双联通分量)
题意: 给你一个无向图,要求把所有无向边改成有向边,并且添加最少的有向边,使得新的有向图强联通. 分析: 这题的解法还是很好想的.先用边双联通分量缩点,然后找新图中入度为0和为1的点,入度为0则ans ...
- UVA10972 - RevolC FaeLoN(双连通分量)
题目链接 题意: 给定一个无向图,问最少加入多少条边,使得这个图成为连通图 思路:首先注意题目给出的无向图可能是非连通的,即存在孤立点.处理孤立点之后.其它就能够当作连通块来处理.事实上跟POJ335 ...
- UVA-10972 RevolC FaeLoN (边双连通+缩点)
题目大意:将n个点,m条边的无向图变成强连通图,最少需要加几条有向边. 题目分析:所谓强连通,就是无向图中任意两点可互达.找出所有的边连通分量,每一个边连通分量都是强连通的,那么缩点得到bcc图,只需 ...
随机推荐
- 引用&符号详解
变量的引用 PHP 的引用允许你用两个变量来指向同一个内容. 例一: <?php $a="2010"; $b =&$a; echo $a;//这里输出:2010 ec ...
- 《Scrum实战》第0次课【如何学习敏捷】全团课后任务汇总
<Scrum实战>第0次课作业 完成情况: 课程名称:如何学习敏捷 1组 孟帅 孟帅: http://www.cnblogs.com/mengshuai1982/p/7096338.htm ...
- 自建NAS如何使用大于2TB的硬盘(从分区开始)
目录 自建NAS如何使用大于2TB的硬盘(从分区开始) 对分区进行格式化 挂载到某一目录(需设置开机自动挂载) 上传文件测试: 补充 自建NAS如何使用大于2TB的硬盘(从分区开始) 需求说明: 自建 ...
- python之路 --- python模块初认识&数据类型
一.模块初识 首先,文件名不能和导入的模块名称一样.因为系统默认先从当前文件寻找模块名,如果文件名和导入的模块名称一样的话,就相当于自己调用自己,会找不到相应的方法的. sys模块 sys.path ...
- javascript是脚本语言?javascript万物皆对象?
呵呵哒!带你见识下js面对对象的魅力 是的是的,退后,朕要开始装逼了- 这是什么鸟东西?是的是的,装逼开始,2016年度最佳JS编译器,ES6标准出来后,小伙伴们对新特性摩拳擦掌,奈何浏览器支持把我们 ...
- [译]__main__ 顶级脚本环境
'main'是其中顶级代码执行的范围的名称.一个模块的__name__可以从标准输入,脚本,或从一个交互式命令行中等方式被设置成等于'main'. 一个模块可以发现它是否是通过检查自身在主运行范围__ ...
- linux 下java jar包的方法
test.java 和 example.jar 在同一目录:并且test.java引用了example.jar 首先编译test.java: javac -cp example.jar test. ...
- .Net程序员自学dump分析教程
文章:.Net程序员自学dump分析教程 可以分析内存状态.
- ACM程序设计选修课——1076汇编语言(重定向+模拟)
1076: 汇编语言 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 34 Solved: 4 [Submit][Status][Web Board] ...
- java面试题之哨兵如何判断主服务器是否下线?
通过流言协议来接收关于主服务器是否下线的信息,并使用投票协议来决定是否执行自动故障迁移,以及选择哪个从服务器作为新的主服务器.