POJ - 3177 Redundant Paths(边双连通分支)(模板)
1、给定一个连通的无向图G,至少要添加几条边,才能使其变为双连通图。
2、
3、
- //边双连通分支
- /*
- 去掉桥,其余的连通分支就是边双连通分支了。一个有桥的连通图要变成边双连通图的话,
- 把双连通子图收缩为一个点,形成一颗树。需要加的边为(leaf+1)/2(leaf为叶子结点的个数)
- POJ 3177 给定一个连通的无向图G,至少要添加几条边,才能使其变为双连通图。
- */
- #include<iostream>
- #include<stdio.h>
- #include<string.h>
- using namespace std;
- const int MAXN=;//点数
- const int MAXM=;//边数,因为是无向图,所以这个值要 *2
- struct Edge{
- int to,next;
- bool cut;//是否是桥标记
- }edge[MAXM];
- int head[MAXN],tot;
- int Low[MAXN],DFN[MAXN],Stack[MAXN],Belong[MAXN];//Belong 数组的值是1~block
- int Index,top;
- int block;//边双连通块数
- bool Instack[MAXN];
- int bridge;//桥的数目
- void addedge(int u,int v){
- edge[tot].to=v;
- edge[tot].next=head[u];
- edge[tot].cut=false;
- head[u]=tot++;
- }
- void Tarjan(int u,int pre){
- int v;
- Low[u]=DFN[u]=++Index;
- Stack[top++]=u;
- Instack[u]=true;
- for(int i=head[u];i!=-;i=edge[i].next){
- v=edge[i].to;
- if(v==pre)continue;
- if(!DFN[v]){
- Tarjan(v,u);
- if(Low[u]>Low[v])Low[u]=Low[v];
- if(Low[v]>DFN[u]){
- bridge++;
- edge[i].cut=true;
- edge[i^].cut=true;
- }
- }
- else if(Instack[v]&&Low[u]>DFN[v])
- Low[u]=DFN[v];
- }
- if(Low[u]==DFN[u]){
- block++;
- do{
- v=Stack[--top];
- Instack[v]=false;
- Belong[v]=block;
- }
- while(v!=u);
- }
- }
- void init(){
- tot=;
- memset(head,-,sizeof(head));
- }
- int du[MAXN];//缩点后形成树,每个点的度数
- void solve(int n){
- memset(DFN,,sizeof(DFN));
- memset(Instack,false,sizeof(Instack));
- Index=top=block=;
- Tarjan(,);
- int ans=;
- memset(du,,sizeof(du));
- for(int i=;i<=n;i++)
- for(int j=head[i];j!=-;j=edge[j].next)
- if(edge[j].cut)
- du[Belong[i]]++;
- for(int i=;i<=block;i++)
- if(du[i]==)
- ans++;
- //找叶子结点的个数 ans,构造边双连通图需要加边(ans+1)/2
- printf("%d\n",(ans+)/);
- }
- int main(){
- int n,m;
- int u,v;
- while(scanf("%d%d",&n,&m)==){
- init();
- while(m--){
- scanf("%d%d",&u,&v);
- addedge(u,v);
- addedge(v,u);
- }
- solve(n);
- }
- return ;
- }
POJ - 3177 Redundant Paths(边双连通分支)(模板)的更多相关文章
- Poj 3177 Redundant Paths (双连通分支+节点统计)
题目描述: 给出一个无向的连通图,问最少加入几条边,才能使所给的图变为无桥的双连通图? 解题思路: 可以求出原图中所有的不包含桥的所有最大连通子图,然后对连通子图进行标记缩点,统计度为1的叶子节点le ...
- 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(边双连通的构造)
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 POJ 3352 Road Construction
这两题是一样的,代码完全一样. 就是给了一个连通图,问加多少条边可以变成边双连通. 去掉桥,其余的连通分支就是边双连通分支了.一个有桥的连通图要变成边双连通图的话,把双连通子图收缩为一个点,形成一颗树 ...
- [双连通分量] POJ 3177 Redundant Paths
Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13712 Accepted: 5821 ...
- poj 3177 Redundant Paths
题目链接:http://poj.org/problem?id=3177 边双连通问题,与点双连通还是有区别的!!! 题意是给你一个图(本来是连通的),问你需要加多少边,使任意两点间,都有两条边不重复的 ...
- poj 3177 Redundant Paths【求最少添加多少条边可以使图变成双连通图】【缩点后求入度为1的点个数】
Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11047 Accepted: 4725 ...
随机推荐
- HDU 5421 Victor and String
Victor and String Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on HDU. Orig ...
- php基础 数组 遍历
//参数默认值// function abc($a,$b,$c=0){// echo $a,$b,$c;// }// abc(1,3); //可变参数//function def(){// $arr= ...
- 【Ajax 4】Ajax、JavaScript和JQuery的联系和区别
导读:在之前,就分别学习了Ajax.JavaScript和JQuery,然后对于这三者之间的关系,是一直云里雾里的.尤其是后来学到了Ajax,就更是不明白了.现在,就给总结总结. 一.基本概述 1.1 ...
- C#通信学习(一)
基础知识 TCP/IP:Transmission Control Protocol/Internet Protocol,传输控制协议/因特网互联协议,又名网络通讯协议.简单来说:TCP控制传输数据,负 ...
- POJ-1861,Network,最小生成树水题,,注意题面输出有问题,不必理会~~
Network Time Limit: 1000MS Memory Limit: 30000K Special Judge http://poj.org/problem?id=1 ...
- github新建本地仓库,再同步远程仓库基本用法
github新建本地仓库,再同步远程仓库基本用法 1 mkdir gitRepo 2 cd gitRepo 3 git init #初始化本地仓库 4 git add xxx #添加要push到远 ...
- BZOJ1744: [Usaco2005 oct]Skiing 奶牛滑雪
n<=100 * m<=100的地图,每个数绝对值不超过25,从1,1到n,m,一开始速度v,从数字A走到数字B速度会变成v*2^(A-B),求到终点最短时间. 可以发现,相同的数字出发的 ...
- ACM-ICPC 2018 南京赛区网络预赛 L && BZOJ 2763 分层最短路
https://nanti.jisuanke.com/t/31001 题意 可以把k条边的权值变为0,求s到t的最短路 解析 分层最短路 我们建立k+1层图 层与层之间边权为0,i 向 i+1层转 ...
- C. The Two Routes---cf602C(Dij)
http://codeforces.com/problemset/problem/602/C 题目大意: 有n个城市 有m条铁路 如果两个城市没有铁路 那么一定有公路 求从1 到 n 用铁路和公 ...
- topcoder 649 DIV2
8 A:模拟 9:B:终于看懂题目... 题意:最多分解K次 每分钟一个数可以分解成两个数 或者-1: 关键字:DP,记忆花搜索. DP[I][J]=min(dp[i][j],1+max(dp[ii] ...