Poj 3177 Redundant Paths (双连通分支+节点统计)
题目描述:
给出一个无向的连通图,问最少加入几条边,才能使所给的图变为无桥的双连通图?
解题思路:
可以求出原图中所有的不包含桥的所有最大连通子图,然后对连通子图进行标记缩点,统计度为1的叶子节点leaf有多少个,答案就是(leaf+1)/2;
这个题目有重边,在处理的时候要注意下。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int maxn = ;
struct node
{
int to, next;
} edge[maxn*]; int low[maxn], dfn[maxn], head[maxn], id[maxn], in[maxn];
int stack[maxn], tot, ntime, cnt, top, In;
void init ()
{
tot = ntime = cnt = top = In = ;
memset (in, , sizeof(in));
memset (id, , sizeof(id));
memset (low, , sizeof(low));
memset (dfn, , sizeof(dfn));
memset (head, -, sizeof(head));
memset (stack, , sizeof(stack));
}
void Add (int from, int to)
{
edge[tot].to = to;
edge[tot].next = head[from];
head[from] = tot++;
}
void Tarjan (int u, int father)
{
int k = ;
low[u] = dfn[u] = ++ntime;
stack[top++] = u;
for (int i=head[u]; i!=-; i=edge[i].next)
{
int v = edge[i].to;
if (v==father && !k)
{//判定重边
k++;
continue;
}
if (!dfn[v])
{
Tarjan (v, u);
low[u] = min (low[v], low[u]);
}
else
low[u] = min (low[u], dfn[v]);
}
if (low[u] == dfn[u])
{
cnt ++;
while ()
{//对同一个连通块内的点染色
int v = stack[--top];
id[v] = cnt;
if (v == u)
break;
}
}
}
int main ()
{
int n, m;
while (scanf ("%d %d", &n, &m) != EOF)
{
init ();
while (m --)
{
int u, v;
scanf ("%d %d", &u, &v);
Add (u, v);
Add (v, u);
}
for (int i=; i<=n; i++)
if (!dfn[i])
Tarjan (i, );
for (int i=; i<=n; i++)
for (int j=head[i]; j!=-; j=edge[j].next)
{
int u = id[i];
int v = id[edge[j].to];
if (v != u)
{//统计缩点后的图中每个点的度
in[v] ++;
in[u] ++;
}
}
for (int i=; i<=cnt; i++)
if (in[i] == )//因为是无向图建图方式的原因,当度为2的时候才是叶子节点
In ++;
printf ("%d\n", (In+)/);
}
return ;
}
Poj 3177 Redundant Paths (双连通分支+节点统计)的更多相关文章
- tarjan算法求桥双连通分量 POJ 3177 Redundant Paths
POJ 3177 Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12598 Accept ...
- POJ 3177 Redundant Paths POJ 3352 Road Construction(双连接)
POJ 3177 Redundant Paths POJ 3352 Road Construction 题目链接 题意:两题一样的.一份代码能交.给定一个连通无向图,问加几条边能使得图变成一个双连通图 ...
- POJ - 3177 Redundant Paths(边双连通分支)(模板)
1.给定一个连通的无向图G,至少要添加几条边,才能使其变为双连通图. 2. 3. //边双连通分支 /* 去掉桥,其余的连通分支就是边双连通分支了.一个有桥的连通图要变成边双连通图的话, 把双连通子图 ...
- POJ 3177 Redundant Paths(边双连通的构造)
Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13717 Accepted: 5824 ...
- POJ 3177——Redundant Paths——————【加边形成边双连通图】
Redundant Paths Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Sub ...
- poj 3177 Redundant Paths
题目链接:http://poj.org/problem?id=3177 边双连通问题,与点双连通还是有区别的!!! 题意是给你一个图(本来是连通的),问你需要加多少边,使任意两点间,都有两条边不重复的 ...
- [双连通分量] POJ 3177 Redundant Paths
Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13712 Accepted: 5821 ...
- POJ 3177 Redundant Paths POJ 3352 Road Construction
这两题是一样的,代码完全一样. 就是给了一个连通图,问加多少条边可以变成边双连通. 去掉桥,其余的连通分支就是边双连通分支了.一个有桥的连通图要变成边双连通图的话,把双连通子图收缩为一个点,形成一颗树 ...
- poj 3177 Redundant Paths【求最少添加多少条边可以使图变成双连通图】【缩点后求入度为1的点个数】
Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11047 Accepted: 4725 ...
随机推荐
- navicat mysql 连接本地 忘记密码 查看密码 操作
https://jingyan.baidu.com/article/454316ab4e9e65f7a7c03ad1.html
- Java 学习(5):修饰符 运算符
目录 --- 修饰符 --- 运算符 --- 循环结构 --- 分支结构 修饰符: 修饰符用来定义类.方法或者变量,通常放在语句的最前端.如下: public class className { // ...
- [bzoj1978][BeiJing2010]取数游戏 game_动态规划_质因数分解
取数游戏 game bzoj-1978 BeiJing-2010 题目大意:给定一个$n$个数的$a$序列,要求取出$k$个数.假设目前取出的数是$a_j$,那么下次取出的$a_k$必须保证:$j&l ...
- linux 的硬链接与软连接
linux 里有硬链接和软连接两种概念.要明白这些概念首先要明白文件在linux 上其实有3个组成部分. data 真正的数据存储区域 inode 一个用来唯一表示data的数据结构 filename ...
- 我的arcgis培训照片9
来自:http://www.cioiot.com/successview-547-1.html
- 配置-XX:+HeapDumpOnOutOfMemoryError 对于OOM错误自动输出dump文件
配置-XX:+HeapDumpOnOutOfMemoryError 对于OOM错误自动输出dump文件 学习了:http://blog.csdn.net/stevendbaguo/article/de ...
- chassis & power
机箱电源 ★ Main board ★ Voltage, connector ★ Hole ★ Ports ★ AT:12``*13.8`` or 12``*13`` 30.5cm*33cm ★ B ...
- Java解惑四:异常之谜
谜题36 finally语句中的return语句会覆盖掉try语句中的. 谜题37 该部分还须要进一步理解 一个方法能够抛出的被检查异常集合是它所适用的全部类型声明要抛出的被检查集合的交集.
- cesm下载备注
新版使用svn下载. 软件要求: The following are the external system and software requirements for installing and ...
- android.app.Fragment与android.support.v4.app.Fragment不一致
在看法中用到的Fragment在类型转换的时候非常easy出现这样的问题: 对照代码: class MyFragmentPagerAdapter extends FragmentPagerAdapte ...