题意:一个连通的无向图,求至少需要添加几条边,救能保证删除任意一条边,图仍然是连通的。

链接:http://poj.org/problem?id=3352

思路:边的双连通图。其实就是要求至少添加几条边,可以使整个图成为一个边双连通图。用tarjan算法(求割点割边)求出low数组,这里可以简化,然 后依据“low相同的点在一个边连通分量中”,缩点之后构造成树(这里可以直接利用low[]数组,low[i]即为第i节点所在的连通分量的标号)。求 出树中出度为1的节点数left,答案即为(leaf+1)/2。

代码:

 #include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <stack>
#define loop(s,i,n) for(i = s;i < n;i++)
#define cl(a,b) memset(a,b,sizeof(a))
const int maxn = ;
using namespace std;
int dfn[maxn],low[maxn],belong[maxn],dfsclock,bcc_cnt;
vector<int>g[maxn];
vector<int>ng[maxn];
struct edge
{
int u,v,w;
};
stack<edge> st;
vector<edge> edges;
stack<int>s;
void init(int n)
{
int i;
for(i = ; i <= n; i++)
g[i].clear();
edges.clear();
return ;
}
int in[maxn];
void tarjan(int u,int pre)
{
int v,i,j;
dfn[u] = low[u] = ++dfsclock;
s.push(u);
loop(,i,g[u].size())
{
v = g[u][i]; if(v != pre)
{
if(!dfn[v])//保证是树枝边
{
tarjan(v,u); low[u] = min(low[v],low[u]); }
else if(dfn[v] < low[u])
low[u] = dfn[v];
} }
if(low[u] ==dfn[u])
{
bcc_cnt++;
int t;
do
{ t = s.top();
s.pop();
belong[t] = bcc_cnt;
}
while(t != u);
}
} void find_bcc(int n)
{
int i;
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low)); memset(belong,,sizeof(belong));
while(!s.empty())s.pop();
dfsclock = bcc_cnt = ;
loop(,i,n)
if(!dfn[i]) tarjan(i,-);
// puts("yes");
// printf("%d """"""\n",bcc_cnt);
} int main()
{
int m,n; while(~scanf("%d %d",&n,&m))
{
init(n);
int i,j;
for(i = ; i <= m; i++)
{
int u,v;
struct edge e;
scanf("%d %d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
e.u = u;
e.v = v;
edges.push_back(e);
} find_bcc(n);
cl(in,);
struct edge e;
for(j = ; j < edges.size(); j++)
{
e = edges[j];
if(belong[e.v] != belong[e.u])
{
in[belong[e.v]]++;
in[belong[e.u]]++;
}
}
int leaf;
leaf = ;
// cout<<bcc_cnt<<endl;
for(i = ; i <= bcc_cnt; i++)
if(in[i]==)
leaf++; cout<<(leaf+)/<<endl;
}
return ;
}

poj 3353 Road Construction tarjan 边双联通分支 缩点+结论的更多相关文章

  1. POJ 3177 Redundant Paths POJ 3352 Road Construction(双连接)

    POJ 3177 Redundant Paths POJ 3352 Road Construction 题目链接 题意:两题一样的.一份代码能交.给定一个连通无向图,问加几条边能使得图变成一个双连通图 ...

  2. poj 3352 Road Construction【边双连通求最少加多少条边使图双连通&&缩点】

    Road Construction Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10141   Accepted: 503 ...

  3. POJ P3352 Road Construction 解题报告

    P3352 Road Construction 描述 这几乎是夏季,这意味着它几乎是夏季施工时间!今年,负责岛屿热带岛屿天堂道路的优秀人士,希望修复和升级岛上各个旅游景点之间的各种道路. 道路本身也很 ...

  4. POJ-3352 Road Construction,tarjan缩点求边双连通!

    Road Construction 本来不想做这个题,下午总结的时候发现自己花了一周的时间学连通图却连什么是边双连通不清楚,于是百度了一下相关内容,原来就是一个点到另一个至少有两条不同的路. 题意:给 ...

  5. Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)

     http://blog.csdn.net/geniusluzh/article/details/6619575 在说Tarjan算法解决桥和边双连通分量问题之前我们先来回顾一下Tarjan算法是如何 ...

  6. POJ 3352 Road Construction(边双连通分量,桥,tarjan)

    题解转自http://blog.csdn.net/lyy289065406/article/details/6762370   文中部分思路或定义模糊,重写的红色部分为修改过的. 大致题意: 某个企业 ...

  7. POJ 3177 Redundant Paths POJ 3352 Road Construction

    这两题是一样的,代码完全一样. 就是给了一个连通图,问加多少条边可以变成边双连通. 去掉桥,其余的连通分支就是边双连通分支了.一个有桥的连通图要变成边双连通图的话,把双连通子图收缩为一个点,形成一颗树 ...

  8. poj 3352 Road Construction(边双连通分量+缩点)

    题目链接:http://poj.org/problem?id=3352 这题和poj 3177 一样,参考http://www.cnblogs.com/frog112111/p/3367039.htm ...

  9. POJ 3352 Road Construction(边—双连通分量)

    http://poj.org/problem?id=3352 题意: 给出一个图,求最少要加多少条边,能把该图变成边—双连通. 思路:双连通分量是没有桥的,dfs一遍,计算出每个结点的low值,如果相 ...

随机推荐

  1. String、StringBuilder

    public class testString{ public static void main(String[] args) { String a="cool"; String ...

  2. 由浅入深了解Thrift之客户端连接池化续

    前文<由浅入深了解Thrift之客户端连接池化>中我们已经实现了服务调用端 连接的池化,实现的过于简陋,离实际的项目运用还很遥远.本文将在进一步改造,主要是两方面:1.服务端如何注册多个服 ...

  3. Content Providers详解

    今天仔细阅读了一遍Content Providers的官方API文档,总结了一下Android中Content Providers的用法. 各种类型的Content Provider对一个结构化的数据 ...

  4. 深入浅出ES6(十二):代理 Proxies

    作者 Jason Orendorff  github主页  https://github.com/jorendorff 请看这样一段代码: var obj = new Proxy({}, { get: ...

  5. HBase保存的各个字段意义解释

    /×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...

  6. C Primer Plus之存储类、链接和内存管理

    存储时期即生存周期——变量在内存中保留的时间 变量的作用域和链接一起表明程序的哪些部分可以通过变量名来使用该变量. 注意:生存期和作用域是两个不同的概念. 作用域    作用域描述了程序中可以访问一个 ...

  7. React组件生命周期-正确执行初始化阶段的函数

    一. 二.代码 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=&quo ...

  8. Android:Android SDK Manager

    Android SDK Manager 包含:Tools(构建工具.编译工具.平台工具等) .各种版本SDK.Extras(安卓知识库和辅助工具) 每个SDK至少包含:1.SDK Plaform 2. ...

  9. logback与Log4J的区别

    原文:http://blog.csdn.net/lwzcjd/article/details/5617200 Logback和log4j是非常相似的,如果你对log4j很熟悉,那对logback很快就 ...

  10. Linux 关机命令详解

    在linux下一些常用的关机/重启命令有shutdown.halt.reboot.及init,它们都可以达到重启系统的目的,但每个命令的内部工作过程是不同的,通过本文的介绍,希望你可以更加灵活的运用各 ...