【UVA10972】RevolC FaeLoN (求边双联通分量)
题意:
给你一个无向图,要求把所有无向边改成有向边,并且添加最少的有向边,使得新的有向图强联通。
分析:
这题的解法还是很好想的。先用边双联通分量缩点,然后找新图中入度为0和为1的点,入度为0则ans+2,为1则ans+1,最后输出(ans+1)/2。
注意,如果原图本来就强联通,答案为0不是1。
在这里主要说说打边双联通的注意事项。(一开始觉得是跟点双连通差不多的,调试的时候才发现很容易疏忽导致BUG很多啊)
1、如果有重边,则那条就不是割边了,我们很容易向上重走树枝边的反向边导致程序认为这是返祖边。在点双连通中判断一下是不是父亲即可,但边双联通不行。(因为重边对点双连通无影响,但对边双联通有影响)所以要做一个标记,走树枝边的时候把反向边也标记一下。
2、stack中的剩余元素最后要记得pop出来。
3、图不一定联通,要for一遍再dfs。
4、发现(x,y)为割边的时候,(dfn[x]<dfn[y]),边双联通分量是算到y而不是x。(跟点双连通有一点不一样)
代码如下:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
#define Maxn 1010 struct node
{
int x,y,next;
bool vis;
}t[*Maxn*Maxn];int len; int first[Maxn],n,m;
int dfn[Maxn],low[Maxn],cnt;
int cc[Maxn],cl,sum[Maxn];
stack<int > s; void ins(int x,int y)
{
t[++len].x=x;t[len].y=y;t[len].vis=;
t[len].next=first[x];first[x]=len;
} int mymin(int x,int y) {return x<y?x:y;} void ffind(int x)
{
dfn[x]=low[x]=++cnt;
s.push(x);
for(int i=first[x];i;i=t[i].next) if(!t[i].vis)
{
int y=t[i].y;
t[i].vis=;t[i+(i%==?:-)].vis=;
if(!dfn[y])
{
ffind(y);
low[x]=mymin(low[x],low[y]);
if(low[y]>dfn[x])
{
cl++;
while(!s.empty())
{
int z=s.top();
s.pop();
cc[z]=cl;
if(z==y) break;
}
}
}
else low[x]=mymin(low[x],dfn[y]);
}
} int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
len=;cnt=;cl=;
memset(first,,sizeof(first));
memset(dfn,,sizeof(dfn));
memset(cc,,sizeof(cc));
memset(sum,,sizeof(sum));
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
ins(x,y);ins(y,x);
}
if(!s.empty()) s.pop();
for(int i=;i<=n;i++)if(!dfn[i])
{
ffind(i);
if(!s.empty())
{
cl++;
while(!s.empty())
{
cc[s.top()]=cl;
s.pop();
}
}
}
if(cl==) {printf("0\n");continue;} int ans=;
for(int i=;i<=len;i++)
{
if(cc[t[i].x]==cc[t[i].y]) continue;
sum[cc[t[i].x]]++;
}
for(int i=;i<=cl;i++) if(sum[i]==) ans++;
else if(sum[i]==) ans+=;
printf("%d\n",(ans+)/);
}
return ;
}
[uva10972]
2016-03-23 13:54:57
【UVA10972】RevolC FaeLoN (求边双联通分量)的更多相关文章
- POJ 2942 Knights of the Round Table 补图+tarjan求点双联通分量+二分图染色+debug
题面还好,就不描述了 重点说题解: 由于仇恨关系不好处理,所以可以搞补图存不仇恨关系, 如果一个桌子上面的人能坐到一起,显然他们满足能构成一个环 所以跑点双联通分量 求点双联通分量我用的是向栈中pus ...
- 洛谷P2860 [USACO06JAN]冗余路径Redundant Paths(tarjan求边双联通分量)
题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1. ...
- poj 3177&&3352 求边双联通分量,先求桥,然后求分量( 临界表代码)
/*这道题是没有重边的,求加几条边构成双联通,求边联通分量,先求出桥然后缩点,成一个棵树 找叶子节点的个数*/ #include<stdio.h>//用容器写在3177这个题上会超内存,但 ...
- hdu 3352 求边双联通分量模板题(容器)
/*这道题是没有重边的,求加几条边构成双联通,求边联通分量,先求出桥然后缩点,成一个棵树 找叶子节点的个数*/ #include<stdio.h> #include<string.h ...
- POJ3177 & 求边双联通分量
题意: 给一张无向图,求加多少边使原图任意两点边双联通. SOL: 一个不会写边双点双强联通的傻逼. 一个结论:把一棵树变成满足条件的图需要加的边使入度为1的点数+1除以2.------>就是树 ...
- UVA-10972 RevolC FaeLoN (边双连通+缩点)
题目大意:将n个点,m条边的无向图变成强连通图,最少需要加几条有向边. 题目分析:所谓强连通,就是无向图中任意两点可互达.找出所有的边连通分量,每一个边连通分量都是强连通的,那么缩点得到bcc图,只需 ...
- ARC062 - F. Painting Graphs with AtCoDeer (Polya+点双联通分量)
似乎好久都没写博客了....赶快来补一篇 题意 给你一个 \(n\) 个点 , 没有重边和自环的图 . 有 \(m\) 条边 , 每条边可以染 \(1 \to k\) 中的一种颜色 . 对于任意一个简 ...
- [J]computer network tarjan边双联通分量+树的直径
https://odzkskevi.qnssl.com/b660f16d70db1969261cd8b11235ec99?v=1537580031 [2012-2013 ACM Central Reg ...
- 【洛谷 SP2878】Knights of the Round Table(双联通分量)
先放这吧,没时间写,明天再补 "明天到了" 题目链接 题意:求不在任何奇环内的点的数量. Tarjan求点双联通分量,然后再染色判断是不是二分图就好了. 只是不懂为什么Tarjan ...
随机推荐
- mvvm框架下页面与ViewModel的各种参数传递方式
传单个参数的话在xaml用 Command={Binding ViewModel的事件处理名称} CommandParameter={Binding 要传递的控件名称} ViewMode ...
- disable_functions(禁用php函数)
我们怎么来设置php禁止运行的函数呢? 其实,我们可以在php.ini文件进行设置,如图
- 聊聊 iOS 中的网络加密
介绍下 公司的接口一般会两种协议的,一种HTTP,一种HTTPS的,HTTP 只要请求,服务器就会响应,如果我们不对请求和响应做出加密处理,所有信息都是会被检测劫持到的,是很不安全的,客户端加密可以使 ...
- Java实现直接插入查找
import java.util.Scanner; /*算法思想:每趟将一个待排序的元素作为关键字,按照关键字值大小插入到已排好序的那部分序列的适当位置上,直到插入完成,*/ /*平均时间复杂度O(n ...
- Nginx高并发配置思路(轻松应对1万并发量)
测试机器为腾讯云服务器1核1G内存,swap分区2G,停用除SSH外的所有服务,仅保留nginx,优化思路主要包括两个层面:系统层面+nginx层面. 一.系统层面 1.调整同时打开文件数量 ulim ...
- ajax 基础教程
这是一本什么书?这是一本技术类的书籍,主要从历史.XMLHttpRequest对象.怎么样于服务器交互.构建完备的Ajax开发工具箱.使用jsUnit测试javascript 代码,总之就是让我们从这 ...
- Java-struts2 之中文乱码问题
中文乱码问题,是个很麻烦的问题,有时候你发现,你表单页面的编码是UTF-8 Stutrst.xml也有这么一句话 <constant name="struts.i18n.encodin ...
- Ganglia3.6.0,nginx+php搭建gweb,监控Hadoop2.2 和 Hbase0.98.1
环境:CentOS6.5 Hadoop2.2.0 Hbase0.98.1 服务端(master): 安装 ganglia ganglia-devel ganglia-gmetad ganglia-gm ...
- C#之垃圾回收
垃圾回收时现代语言的标志之一.垃圾回收解放了手工管理对象释放的工作,提高了程序的健壮性,但是副作用就是程序代码可以对于创建对象变得随意. 1.避免不必要的对象创建 由于垃圾回收的代价较高,所以C#程序 ...
- 6 关于 Oracle NULL栏位和PL./SQL执行实验
今日有针对NULL值有了相关实验. 对NULL 值插入的讨论. 1, PL/SQL 中可以执行插入''或者NULL 的操作, 前提是栏位允许为空. 2, 可以对NULL进行一系列数据库运算. 如: ...