UVA 10972 RevolC FaeLoN(边-双连通+缩点)
很好的一道图论题,整整撸了一上午。。。
题意是给定一个无向图,要求将所有边变为有向边,求最少加入多少条有向边,使得该图强连通?这里先假设一个问题:给定一个无向子图,该子图具有怎样的性质才能使得将其无向边都变为有向边后强连通?显然是边-双连通!边连通的性质就是任意两点间存在边部重合的两条路,所以你懂的。。。
所以这个题的解法就是:求出原图的边-双连通分量后缩点,变成一棵bcc树。现在问题就变成了:给定一棵无向树,添加最少边使得该图强连通?这个问题在纸上画画大概能推出来。。。sum为所有叶子节点的个数,ans便是(sum+1)/ 2。。。求边-双连通的方法大白书说的很清楚了,先dfs标记所有桥,然后再dfs1一次,途中不经过桥就行。
还有一点,原图中可能本来就有孤立点(如sample 2中的点10),那么它所在的bcc点的度数为0,所以要在缩点后处理的时候处理一下孤立点。。。
另外还有一点。。。当原图本来就双连通的时候要特判ans=0。。。
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#include<stack>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<fstream>
#include<sstream>
#include<map>
#include<set>
#define FF(i, a, b) for(int i=a; i<b; i++)
#define FD(i, a, b) for(int i=a; i>=b; i--)
#define REP(i, n) for(int i=0; i<n; i++)
#define CLR(a, b) memset(a, b, sizeof(a))
#define LL long long
#define PB push_back
#define debug puts("**debug**")
using namespace std; const int maxn = 1111;
int n, m, u, v;
int pre[maxn], low[maxn], dfs_clock, bcc_cnt, bccno[maxn], d[maxn];
struct Edge
{
int to, flag;
};
vector<int> G[maxn];
vector<Edge> edges; inline void init()
{
CLR(d, 0);
REP(i, n) G[i].clear(); edges.clear();
} void add(int u, int v)
{
edges.PB((Edge){v, 0});
edges.PB((Edge){u, 0});
int nc = edges.size();
G[u].PB(nc-2);
G[v].PB(nc-1);
} int dfs(int u, int fa)
{
int lowu = pre[u] = ++dfs_clock;
int nc = G[u].size();
REP(i, nc)
{
int v = edges[G[u][i]].to;
if(!pre[v])
{
int lowv = dfs(v, u);
lowu = min(lowu, lowv);
if(lowv > pre[u]) edges[G[u][i]].flag = 1, edges[G[u][i]^1].flag = 1; //标记所有桥
}
else if(pre[v] < pre[u] && v != fa) lowu = min(lowu, pre[v]);
}
return low[u] = lowu;
} void dfs1(int u)
{
bccno[u] = bcc_cnt;
int nc = G[u].size();
REP(i, nc)
{
int v = edges[G[u][i]].to;
if(!bccno[v] && edges[G[u][i]].flag != 1) dfs1(v);//不经过桥
}
} void find_bcc()
{
CLR(pre, 0); CLR(bccno, 0);
dfs_clock = bcc_cnt = 0;
REP(i, n) if(!pre[i]) dfs(i, -1);
REP(i, n) if(!bccno[i]) bcc_cnt++, dfs1(i);
} int main()
{
while(~scanf("%d%d", &n, &m))
{
init();
int ans = 0;
REP(i, m)
{
scanf("%d%d", &u, &v); u--; v--;
add(u, v);
}
find_bcc();
if(bcc_cnt == 1)
{
puts("0");
continue;
}
REP(u, n) //缩点
{
int nc = G[u].size();
REP(i, nc)
{
int v = edges[G[u][i]].to;
if(bccno[u] != bccno[v]) d[bccno[u]]++;
}
}
FF(i, 1, bcc_cnt+1)
{
if(d[i] == 0) ans += 2; //孤立点
if(d[i] == 1) ans++;
}
printf("%d\n", (ans+1)/2);
}
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 cdoj 方老师和农场
//自己写的第一发tarjan 解:先进行双连通分解并缩点,分解后一定是一颗树,设叶节点个数为n那么答案就是(n+1)/2 关于双连通分量求解:在跑tarjan时判断每个点连向父节点的边是否是桥,如果 ...
- UVA - 10972 RevolC FaeLoN
一道特别好的题qwq. 题目大意就是给你一个无向图,让你把边定向之后再加一些边使得这个图强连通,求最少需要加多少边. 一开始毫无头绪23333,数据范围让人摸不着头脑..... 然后开始画图,,,发现 ...
- UVA 10972 RevolC FaeLoN(边连通分量)
坑了我一天的题目..跑了20ms挂了,就知道有个小毛病= = 无向图转有向图判强连通. 首先要知道什么样的无向图可以转化为强连通图?连通分量(环)自然是可以的:那么扩大范围(存在割顶),发现点连通分量 ...
- hdu 4612 Warm up 双连通缩点+树的直径
首先双连通缩点建立新图(顺带求原图的总的桥数,事实上因为原图是一个强连通图,所以桥就等于缩点后的边) 此时得到的图类似树结构,对于新图求一次直径,也就是最长链. 我们新建的边就一定是连接这条最长链的首 ...
- 边双连通缩点+树dp 2015 ACM Arabella Collegiate Programming Contest的Gym - 100676H
http://codeforces.com/gym/100676/attachments 题目大意: 有n个城市,有m条路,每条路都有边长,如果某几个城市的路能组成一个环,那么在环中的这些城市就有传送 ...
- POJ 3177 Redundant Paths (边双连通+缩点)
<题目链接> <转载于 >>> > 题目大意: 有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新 ...
- POJ - 3177 Redundant Paths (边双连通缩点)
题意:在一张图中最少可以添加几条边,使其中任意两点间都有两条不重复的路径(路径中任意一条边都不同). 分析:问题就是最少添加几条边,使其成为边双连通图.可以先将图中所有边双连通分量缩点,之后得到的就是 ...
- poj 3352 Road Construction【边双连通求最少加多少条边使图双连通&&缩点】
Road Construction Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10141 Accepted: 503 ...
随机推荐
- (转)USB 基本知识
USB的重要关键字: 1.端点:位于USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据,每一个端点都有惟一的确定地址,有不同的传输特性(如输入端点.输出端点.配置端点.批量传输端点) ...
- SSO单点登录的发展由来以及实现原理【转】
单点登录以及权限,在很早之前都有写过,不过都比较简单,今天就具体说一下,以及下一步要做的 1.web单系统应用 早期我们开发web应用都是所有的包放在一起打成一个war包放入tomcat容器来运行的, ...
- 很多人都没用过的轻量级Oracle数据库数据导出工具SQLLDR2——性能超赞
SQLLDR2 介绍 每周发表一篇数据库或大数据相关的帖子,敬请关注 1. 工具介绍 Sqluldr2(SQL * UnLoader 第二版)是灵活与强大的 Oracle 文本导出程序,已被大众使 用 ...
- 初学Memcached安装及使用【转】
1.yum install memcached安装memecached 2.chkconfig memcached on设置memcached开机启动 3.service memcached star ...
- 【转载】WebDriver(C#)之十点使用心得
使用Selenium WebDriver驱动浏览器测试的过程中多多少少会遇到一些折腾人的问题,总结了一部分,做下分享. 一.隐藏元素处理(element not visible) 使用WebDrive ...
- ftp--vsftp\pureftpd
FTP是File Transfer Protocol(文件传输协议),用于Internet上的控制文件的双向传输. 现今常用在一个局域网内,如学校.公司等一个指定范围的区域.(因为太过于简单和不安全) ...
- mysql delete 注意
mysql中You can't specify target table <tbl> for update in FROM clause错误的意思是说,不能先select出同一表中的某些值 ...
- Mysql的刷脏页问题
平时的工作中,不知道你有没有遇到过这样的场景,一条 SQL 语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短. 当内存数据 ...
- WinPhone8 开发(一)[SDK安装+新建项目]
微软 WinPhone8 开发 winphone8 SDK下载地址,见博客:http://blog.csdn.net/attagain/article/details/8509511 SDK安装界面: ...
- html5.2新特性【长期更新】
先来说几个新定义: 1.p标签里只能是文字内容,不能在里面使用浮动,定位这些特性了.语义化加强,p标签就是文字标签. 2.legend以前只能是纯文本,新版可以加标签了,很爽吧. <fields ...