poj3352 road construction tarjan求双连通分量

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

题意:求出图中再加上几条边会全部边双连通。

思路大概就是求出图中所有的双连通分量,然后像$SCC$一样缩点,缩完后每两个双连通分量再连边即可。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn=1005;
 7 struct node
 8 {
 9     int from,to,next;
10 }edge[maxn<<1];
11 int head[maxn],tot;
12 void addedge(int u,int v)
13 {
14     edge[++tot]=(node){u,v,head[u]};head[u]=tot;
15 }
16 int dfn[maxn],low[maxn],cnt,bcnt,n,r,belong[maxn];
17 #include<stack>
18 stack<int>s;
19 void tarjan(int root,int id)
20 {
21     dfn[root]=low[root]=++cnt;s.push(root);
22     for(int i=head[root];i;i=edge[i].next)
23     {
24         int v=edge[i].to;
25         if((((i-1)>>1))!=id)
26         {
27             if(!dfn[v])
28             {
29                 tarjan(v,(i-1)>>1);
30                 low[root]=min(low[root],low[v]);
31             }
32             else low[root]=min(low[root],dfn[v]);
33         }
34     }
35     if(dfn[root]==low[root])
36     {
37         int k;bcnt++;
38         do
39         {
40             k=s.top();s.pop();
41             belong[k]=bcnt;
42         }while(k!=root);
43     }
44 }
45 int degree[maxn];
46 int haha()
47 {
48     scanf("%d%d",&n,&r);
49     for(int i=1;i<=r;i++)
50     {
51         int x,y;scanf("%d%d",&x,&y);
52         addedge(x,y);addedge(y,x);
53     }
54     for(int i=1;i<=n;i++)
55         if(!dfn[i])tarjan(i,-1);
56     for(int i=1;i<=tot;i++)
57     {
58         int u=edge[i].from,v=edge[i].to;
59         if(belong[u]!=belong[v])degree[belong[u]]++,degree[belong[v]]++;
60     }
61     int num=0;
62     for(int i=1;i<=bcnt&&bcnt>1;i++)
63         if(degree[i]<=2)num++;
64     printf("%d\n",(num+1)>>1);
65     return 0;
66 }
67 int sb=haha();
68 int main(){;}

poj3352

时间: 2024-10-29 01:08:26

poj3352 road construction tarjan求双连通分量的相关文章

POJ3352 Road Construction Tarjan+边双连通

题目链接:http://poj.org/problem?id=3352 题目要求求出无向图中最少需要多少边能够使得该图边双连通. 在图G中,如果任意两个点之间有两条边不重复的路径,称为“边双连通”,去掉任何一条边都是其他边仍然是连通的,也就是说边双连通图中没有割边. 算法设计是:运用tarjan+缩点.对于每一个边双连通分量,我们都可以把它视作一个点,因为low值相同的点处在同一个边双连通分量中,可以简单地思考一下,(u,v)之间有两条可达的路径,dfs一定可以从一条路开始搜索并且从另一条路回去

【POJ3352】Road Construction tarjan求边-双连通分量,裸题模板题

转载请注明出处:http://blog.csdn.net/vmurder/article/details/42671851 其实我就是觉得原创的访问量比未授权盗版多有点不爽233... 裸题只给模板. tarjan可以实现. 太水不发题解. 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 1010 #define M 202

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

http://poj.org/problem?id=3352 题意: 给出一个图,求最少要加多少条边,能把该图变成边—双连通. 思路:双连通分量是没有桥的,dfs一遍,计算出每个结点的low值,如果相等,说明属于同一个双连通分量. 接下来把连通分量缩点,然后把这些点连边. 对于一棵无向树,我们要使得其变成边双连通图,需要添加的边数 == (树中度数为1的点的个数+1)/2. 1 #include<iostream> 2 #include<algorithm> 3 #include&

POJ3352 Road Construction【边双联通分量】【Tarjan】

题目链接: http://poj.org/problem?id=3352 题目大意: 一个热带天堂岛上有N个旅游景点,任意2个旅游景点之间都有路径(并不一定直接相连).为了使游客 往返更便捷,该旅游公司要求增加一些道路.在施工的时候,每次只能选择一条道路施工,在施工完 毕之前,除了该道路意外,其他道路依旧能够通行.因为施工道路禁止通行,这就导致了在施工期间 游客可能无法到达一些经典. 该公司为了保证在施工期间所有的旅游景点都能够向游客开放,该公司决定搭建一些临时桥梁,使得 无论在哪条道路施工,游

[bzoj3331] [BeiJing2013] 压力(tarjan 点双连通分量)

题干: 这世界上有N个网络设备,他们之间有M个双向的链接.这个世界是连通的.在一段时间里,有Q个数据包要从一个网络设备发送到另一个网络设备.一个网络设备承受的压力有多大呢?很显然,这取决于Q个数据包各自走的路径.不过,某些数据包无论走什么路径都不可避免的要通过某些网络设备.你要计算:对每个网络设备,必须通过(包括起点.终点)他的数据包有多少个? 对于40%的数据,N,M,Q≤2000 对于60%的数据,N,M,Q≤40000 对于100%的数据,N≤100000,M,Q≤200000 题解: 必

poj3352 Road Construction &amp; poj3177 Redundant Paths (边双连通分量)题解

题意:有n个点,m条路,问你最少加几条边,让整个图变成边双连通分量. 思路:缩点后变成一颗树,最少加边 = (度为1的点 + 1)/ 2.3177有重边,如果出现重边,用并查集合并两个端点所在的缩点后的点. 代码: /*3352*/ #include<set> #include<map> #include<stack> #include<cmath> #include<queue> #include<vector> #include&

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

Road Construction Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10141   Accepted: 5031 Description It's almost summer time, and that means that it's almost summer construction time! This year, the good people who are in charge of the r

【连通图|边双连通+缩点】POJ-3352 Road Construction

Road Construction Time Limit: 2000MS Memory Limit: 65536K Description It's almost summer time, and that means that it's almost summer construction time! This year, the good people who are in charge of the roads on the tropical island paradise of Remo

求双连通分量的详解。(根据刘汝佳的训练指南p314)

无向图的双连通分量 点-双连通图:一个连通的无向图内部没有割点,那么该图是点-双连通图.         注意:孤立点,以及两点一边这两种图都是点-双连通的.因为它们都是内部无割点. 边-双连通图:一个连通的无向图内部没有桥,那么该图就是边-双连通的.         注意:孤立点是边-双连通的,但是两点一边不是边-双连通的. 由上面定义可以知道:点-双连通图不一定是边-双连通的. 对于一张无向图,点-双连通的极大子图称为双连通分量.不难发现,每条边恰好属于一个双连通分量(所以两点一边是一个点-