[kuangbin带你飞]专题九 连通图E POJ 3177 Redundant Paths
这个题最开始我想的是,直接缩点求双连通分量,连接这些双联通分量不就行了吗?
但是其实是不对的,双连通内部双联通,我们如果任意的连接一条边在这些双联通分量之间,他们之间有没有桥其实并不知道。
我应该是求缩点以后的叶子节点的个数,因为叶子节对于其本身来说,只有一条桥于其相连,我们可以连接两个叶子节点。那么这个两个区域就合成了一个双联通分量区域。同时为了减少边的使用,我们可以连接两个都是叶子节点的点。最后+1,剩下一个也应该连接。这样就能非常容易的算出把图变成双连通,所需要的边的数目。
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
using namespace std;
const int N = 1e4+,M = 1e5+;
int head[N],Next[M],ver[M],low[M],dfn[M],stack[M];
int block;
int belong[M],deg[M];
bool brige[M],ins[M];
int c[M],dcc,top;
int tot,n,m,num,cnt;
void add(int x,int y)
{
ver[++tot]=y;
Next[tot]=head[x];
head[x]=tot;
}
void tarjan(int u,int pre)
{
int v;
dfn[u]=low[u]=++num;
stack[++top]=u;
ins[u]=;
for (int i=head[u]; i; i=Next[i])
{
v=ver[i];
if (v==pre)continue;
if (!dfn[v])
{
tarjan(v,u);
low[u]=min(low[u],low[v]);
if (low[v]>dfn[u])
{
brige[i]=;//标记为桥
brige[i^]=;
cnt++;
}
}
else low[u]=min(low[u],dfn[v]);
}
if (low[u]==dfn[u]){//如果当前节点是一个根节点 也就是说我们DFS完了这个连通分量
cnt++;
do
{
v=stack[top--];//把这个连通分量里面的所有点都拿出来
ins[v]=;
c[v]=cnt;//标记上所在的连通分量
}while(u!=v);
}
}
void init(){
memset(Next,,sizeof(Next));
memset(low,,sizeof(low));
memset(brige,,sizeof(brige));
memset(head,,sizeof(head));
memset(ver,,sizeof(ver));
memset(dfn,,sizeof(dfn));
memset(c,,sizeof(c));
tot=;
cnt=;
num=;
dcc=;
top=;
}
int main()
{
int u,v;
while(~scanf("%d%d",&n,&m))
{
init();
for (int i=; i<=m; i++)
{
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
for (int i=;i<=n;i++){
if (!dfn[i]){
tarjan(i,i);
}
}
for (int i=;i<=n;i++){
for (int j=head[i];j;j=Next[j])
{
if (brige[j]) //缩点后把桥两边的缩点的度++
deg[c[i]]++;
}
}
int ans=;
for (int i=;i<=cnt;i++){
if (deg[i]==){//我们找出缩点后度为1的点,也就是叶子节点,
ans++;
}
}
printf("%d\n",(ans+)/);//那么把图连接成双联通分量的所需边=(缩点后叶子节点的个数+1)/2
//因为很简单 我把叶子节点两两连接起来,那么这样消耗的边也就是最少的。这样我们就能让图
//变成双联通的
}
return ;
}
[kuangbin带你飞]专题九 连通图E POJ 3177 Redundant Paths的更多相关文章
- [kuangbin带你飞]专题九 连通图
ID Origin Title 76 / 163 Problem A POJ 1236 Network of Schools 59 / 177 Problem B UVA 315 Ne ...
- [kuangbin带你飞]专题九 连通图D - Network POJ - 3694
这道题其实也非常简单,只是在求割边及其个数的情况下,每次往里面加入新的边,并再次计算割边的个数. 我们用tarjan可以求出原图的桥以及个数,当然我们不能暴力加边,然后求解,那么如何求呢??? 其实非 ...
- [kuangbin带你飞]专题九 连通图C - Critical Links UVA - 796
这道题就是要求桥的个数. 那么桥相应的也有判定的定理: 在和u相邻的节点中,存在一个节点是最小的时间戳都比 当前u的访问次序要大,也就是说这个点是只能通过果u到达,那么 他们之间相邻的边就是的桥 #i ...
- [kuangbin带你飞]专题九 连通图B - Network UVA - 315
判断割点的性质: 如果点y满足 low[y]>=dfn[x] 且不是根节点 或者是根节点,满足上述式子的有两个及其以上. 就是割点 如果是起点,那么至少需要两个子节点满足上述条件,因为它是根节点 ...
- 给自己的小练习19-[kuangbin带你飞]专题九连通图
没有写题解.补一波 Network of Schools 问题1:求有向图中入度为0的点个数 问题2:使得整个图变成一个联通分量 问题1直接缩点统计 问题2=max(入度为0的点,出度为0的点),注意 ...
- [kuangbin带你飞]专题1-23题目清单总结
[kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...
- 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开
[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 这是一道经典的八数码问题.首先,简单介绍一下八数码问题: 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的 ...
- POJ 3177——Redundant Paths——————【加边形成边双连通图】
Redundant Paths Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Sub ...
- [kuangbin带你飞]专题十 匹配问题
A-L 二分匹配 M-O 二分图多重匹配 P-Q 二分图最大权匹配 R-S 一般图匹配带花树 模板请自己找 ID Origin Title 61 / 72 Problem A HD ...
随机推荐
- java-面向对象-封装-this-构造函数
概要图 一 构造函数 需求:为了描述事物更准确,发现事物对应的很多对象一创建时, 就有了,一些初始化的数据.在类中该如何完成的. 通过Java中的另一个小技术完成:就是构造函数.对象本身就是构造出 ...
- 2019-4-16-C#-在-8.0-对比-string-和-string_-的类型
title author date CreateTime categories C# 在 8.0 对比 string 和 string? 的类型 lindexi 2019-04-16 10:16:56 ...
- 【模板】LIS模板 洛谷P1091 [NOIP2004提高组]合唱队形 [2017年4月计划 动态规划11]
以题写模板. 写了两个:n^2版本与nlogn版本 P1091 合唱队形 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队 ...
- Django静态文件以及模板文件的配置 jQuery v1.12.4
1.配置模板的路径 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os. ...
- day38 14-Spring的Bean的属性的注入:集合属性的注入
集合:List.Set.Map. package cn.itcast.spring3.demo6; import java.util.List; import java.util.Map; impor ...
- js流星雨效果
css部分 div { border: 0px solid #fff; border-width: 0px 90px 2px 90px; border-color: transparent trans ...
- golang变量-数据类型一
package main import "fmt" var t1 = 100 var t2 = 200 var t3 = 300 var ( u1 = 100 u2 = 200 u ...
- python判断输入日期是该年的第几天
1.输入日期,判断日期是该年度的第几天 iyear = int(input("请输入年:\n")) imonth = int(input("请输入月:\n")) ...
- JS对HTML实体字符转义和反转义
一.名词解释 HTML实体字符: 由于在HTML中有些符号是预留的,比如在html中不能直接使用尖括号(‘<’或‘>’),会被误认为标签符号.所以需要通过HTML实体字符去进行替换: HT ...
- SQL执行计划Cost与性能之间的的关系
关于执行计划Cost的三个疑问: 1. 执行计划的Cost越低,SQL就一定跑得越快吗?或者说Cost 和 执行时间成比例关系吗? 2. Oracle 默认产生的执行计划是Cost最低的吗? 3. 如 ...