博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3352 Road Construction 无向图的边双连通分量
阅读量:4670 次
发布时间:2019-06-09

本文共 1821 字,大约阅读时间需要 6 分钟。

【题意】

给定一个双向连通的公路网,当某些公路路段检修的时候可能会由于该段公路不通,可能会使某些旅游点之间无法通行,求至少新建多少条公路,使得任意对一段公路进行检修的时候,所有的旅游景点之间仍然畅通。

造成公路不通的原因是图中存在桥,所以题目要求的是添加最少条公路使图中不存在桥。

 1 
//
3352    Accepted    228K    32MS    C++    1333B    2013-03-07 09:54:55
 2 
//
利用low[i]缩点
 3 
#include<stdio.h>
 4 #include<
string.h>
 5 #include<stack>
 6 
using 
namespace std;
 7 
#define N 1005
 8 
#define M 2010
 9 
10 
int low[N],dfn[N],ins[N],degree[N],fa[N],index,s;
11 
struct Edge
12 {
13     
int e,next;
14 }edge[M];
15 
int tail[N],eNum;
16 
char a[
10];
17 stack <
int>st;
18 
19 
int Min(
int x,
int y)
20 {
21     
if(x>y)
return y;
22     
return x;
23 }
24 
void Add(
int x,
int y)
25 {
26     edge[eNum].e=y;
27     edge[eNum].next=tail[x];
28     tail[x]=eNum++;
29 }
30 
void Init(
int n)
31 {
32     memset(dfn,-
1,
sizeof(dfn));
33     memset(tail,-
1,
sizeof(tail));
34     memset(ins,
0,
sizeof(ins));
35     
for(
int i=
1;i<=n;i++)
36     {
37         degree[i]=
0;
38         fa[i]=i;
39     }
40 }
41 
void Tarjan(
int u,
int f)
42 {
43     dfn[u]=low[u]=++index;
44     
for(
int i=tail[u];i!=-
1;i=edge[i].next)
45     {
46         
int v=edge[i].e;
47         
if(v==f)
continue;
48         
if(dfn[v]==-
1)
49         {
50             Tarjan(v,u);
51             low[u]=Min(low[u],low[v]);
52         }
53         
else
54             low[u]=Min(low[u],dfn[v]);
55     }
56 }
57 
58 
int main()
59 {
60     
int n,m,x,y,num;
61     scanf(
"
%d%d
",&n,&m);
62     Init(n);
63     index=
0;eNum=
1;s=
0;num=
0;
64     
while(m--)
65     {
66         scanf(
"
%d%d
",&x,&y);
67         Add(x,y);
68         Add(y,x);
69     }
70     
for(
int i=
1;i<=n;i++)
71         
if(dfn[i]==-
1)
72             Tarjan(i,-
1);
73     
for(
int i=
1;i<=n;i++)
74     {
75         
for(
int j=tail[i];j!=-
1;j=edge[j].next)
76         {
77             
if(low[i]!=low[edge[j].e])
78                 degree[low[i]]++;
//
因为是无向图,只记录出度(入度也可)
79 
        }
80     }
81     
for(
int i=
1;i<=n;i++)
82         
if(degree[i]==
1)
83             num++;
84     
for(
int i=
1;i<=n;i++)
85         printf(
"
low[%d]=%d\n
",i,low[i]);
86     printf(
"
%d\n
",(num+
1)/
2);
87     
//
while(1);
88 
    
return 
0;

89 } 

 

转载于:https://www.cnblogs.com/byluoluo/archive/2013/03/07/2947842.html

你可能感兴趣的文章
javascrip学习之 数据类型和变量
查看>>
免费的DNS服务器
查看>>
Vim编辑器
查看>>
BZOJ 4094 USACO 2013 Dec. Optimal Milking
查看>>
电子电工学习方法
查看>>
【OpenJ_Bailian - 2790】迷宫(bfs)
查看>>
What's New In Python 3.X
查看>>
MyBatis(3):SQL映射
查看>>
PostQuitMessage, PostThreadMessage( WM_QUIT )
查看>>
升压转换器 (Boost)
查看>>
构建执法阅读笔记六
查看>>
2019年度苏州之春摄影作品展
查看>>
Css Hack
查看>>
高强度的加密软件怎么制作
查看>>
出现java.lang.IllegalArgumentException异常
查看>>
js获取select标签选中的值
查看>>
完成课件中的动手动脑的或需要验证的相关内容。
查看>>
UISearchBar控件
查看>>
xUtils
查看>>
转, C# 如何在MVC3中取消备用控制器的选择
查看>>