POJ 3177

这题要的是我们求出我们需要增加多少条边才能让整个图变成一整个双连通块。

可以进行对图缩点。

缩点后,新图是一棵树,树的边就是原无向图的桥。

现在问题转化为:在树中至少添加多少条边能使图变为双连通图。

结论:添加边数=(树中度为1的节点数+1)/2

 1 include <iostream>
 2 #include <cstdio>
 3 #include <string.h>
 4 using namespace std;
 5 const int N=10002;
 6 int dfn[N],low[N],first[N],in[N];
 7 bool visit[N];
 8 int mun,deep,sum,n;
 9 struct edge{
10     int v,next;
11 }e[N];
12 void init(){
13     mun=0;
14     deep=0;
15     sum=0;
16     memset(first,-1,sizeof(first));
17     memset(dfn,0,sizeof(dfn));
18     memset(low,0,sizeof(low));
19     memset(in,0,sizeof(in));
20 }
21 void addedge(int u,int v){
22     e[mun].v=v;
23     e[mun].next=first[u];
24     first[u]=mun++;
25 }
26 void dfs(int u,int fa){
27     dfn[u]=low[u]=++deep;
28     for(int i=first[u];i!=-1;i=e[i].next){
29         int v=e[i].v;
30         if(!dfn[v]){
31             dfs(v,u);
32             low[u]=min(low[v],low[u]);
33         }
34         else if(v!=fa)low[u]=min(low[u],dfn[v]);
35     }
36 }
37 void count(){
38     for(int i = 1;i <=n;i ++){
39         memset(visit,0,sizeof(visit));                                  //visit是为了防止重边
40         for(int j=first[i];j!=-1;j=e[j].next){
41             int v=e[j].v;
42             if (low[v]!= low[i]&&!visit[v]){in[low[i]]++;visit[v]=1;}
43         }
44     }
45     for (int i = 1;i <= n;i ++)                                         //统计度为1的边数
46         if (in[i] == 1) sum ++;
47 }
48 int main(){
49     int x,y,m;
50     while(scanf("%d%d",&n,&m)!=EOF){
51         init();
52         while(m--){
53             scanf("%d%d",&x,&y);                                        //边为双向;
54             addedge(x,y);
55             addedge(y,x);
56         }
57         dfs(1,-1);
58         count();
59         printf ("%d\n",(sum + 1)/2);
60     }
61     return 0;
62 }

POJ 3177,布布扣,bubuko.com

时间: 2024-10-22 07:26:33

POJ 3177的相关文章

tarjan算法求桥双连通分量 POJ 3177 Redundant Paths

POJ 3177 Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12598   Accepted: 5330 Description In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1..F) to another field, Bessie and the re

poj 3177 &amp; 3352 【无向图双连通分量Tarjan】

题目:poj 3177 & 3352 题意:大概意思就是给你一个无向图,让你添加最少的边,让所有点都双连通. 分析:双连通的定义就是任意两个点至少有两条路可达. 其实做法跟添加最少边强连通一样,先对图中已经双连通的缩点,然后重新编号. 这就是著名的Tanjan算法. 通过搜索的思想对所有存在环的边遍相同的号 如果要让所有的点双连通,那么对于缩点后的图中如果度数为 1 的话,这些边肯定要连接到其他的点才能双连通,而题目要求添加最少,所以连接到其他度数也为 1 的点是最优的,那么答案就是(odd+1

poj 3177 Redundant Paths

Description In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1..F) to another field, Bessie and the rest of the herd are forced to cross near the Tree of Rotten Apples. The cows are now tired of often being forc

POJ 3177 Redundant Paths(Tarjan)

题目链接 题意 : 一个无向连通图,最少添加几条边使其成为一个边连通分量 . 思路 :先用Tarjan缩点,缩点之后的图一定是一棵树,边连通度为1.然后找到所有叶子节点,即度数为1的节点的个数leaf,最后要添加的边的条数就是(leaf+1)/2 : 1 // 3177 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 7 using

POJ 3177 边双连通求连通量度的问题

这道题的总体思路就是找到连通量让它能够看作一个集合,然后找这个集合的度,度数为1的连通量为k,那么需要添加(k+1)/2条边才可以保证边双连通 这里因为一个连通量中low[]大小是相同的,所以我们用ans[low[i]]++来计度数 这道题我最开始按学长的模板来写....MLE到哭了,也不知道这道题为什么这么逗,把5000的数组改成1000也能过,当然后来换了别的思路 为了防止重边的进入,开始设置了一个hash[][]二维数组来判断边是否已经存在,不额外添入 之后,我不采用二维数组,而是在get

POJ 3177 Redundant Paths (双连通)

题目地址:POJ 3177 找出各个双连通分量度数为1的点,然后作为叶子节点,那么ans=(叶子结点数+1)/2.需要注意的是有重边. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h> #include <map> #include

POJ 3177 Redundant Paths POJ 3352 Road Construction(双连通)

POJ 3177 Redundant Paths POJ 3352 Road Construction 题目链接 题意:两题一样的,一份代码能交,给定一个连通无向图,问加几条边能使得图变成一个双连通图 思路:先求双连通,缩点后,计算入度为1的个数,然后(个数 + 1) / 2 就是答案(这题由于是只有一个连通块所以可以这么搞,如果有多个,就不能这样搞了) 代码: #include <cstdio> #include <cstring> #include <algorithm&

Redundant Paths POJ - 3177(边双连通)

Redundant Paths POJ - 3177 题意:一个无向图(有重边!!),问至少还要加多少边使得去掉任意一条边后任意两点仍可互达. 和上题poj3352基本相同,不过dfs的时候,不能用v!=f来判断是否能走,而要用当前走的边和上一条边是不是反向边 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 using namesp

POJ 3352 Road Construction POJ 3177 Redundant Paths(边双连通图 Tarjan+缩点)

POJ 3352 Road Construction POJ 3177 Redundant Paths(边双连通图 Tarjan+缩点) ACM 题目地址: POJ 3352 Road Construction POJ 3177 Redundant Paths 题意: 问要添加几条边才能使所给无向图图变成边双连通图. 分析: 边连通度:使无向图G不连通的最少删边数量为其边连通度. 边双连通图:边连通度大于1的无向图. 首先缩点,让图变成一个DAG. 现在问题转化为:在树中至少添加多少条边能使图变