poj3352 Road Construction 边双连通分量tarjan算法

来源:互联网 发布:方舟生存进化画面优化 编辑:程序博客网 时间:2024/06/05 02:07

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

题意:有n个城市m条道路,一开始任何两个城市相互可达。现在需要某条修路,修路时该道路不可通行。然后需要搭建临时的桥,使得任何两个城市仍是相互可达的。求最少需要搭建的桥的数量。

题解:这是一个无向图,去掉一条边就不连通。那么这条边就是桥。现在要搭建临时的桥,搭建完后与原图一起,这个有向图就是边双连通的(边连通度大于1)。现在就是求加上几条边使得这个无向图是边双连通的。

首先tarjan求出边双连通分量,对边双连通分量进行缩点,那么就形成一棵树。

然后就是对于一棵树,如何加边使得它边双连通,有一个结论:加边数=(叶子节点数+1)/2。即加边后无度数为1的点。

代码:

#include<set>#include<map>#include<queue>#include<vector>#include<string>#include<bitset>#include<algorithm>#include<cstring>#include<cstdio>#include<cmath>#include<ctime>#include<iomanip>#include<iostream>#define debug cout<<"aaa"<<endl#define d(a) cout<<a<<endl#define mem(a,b) memset(a,b,sizeof(a))#define LL long long#define lson l,mid,root<<1#define rson mid+1,r,root<<1|1#define MIN_INT (-2147483647-1)#define MAX_INT 2147483647#define MAX_LL 9223372036854775807i64#define MIN_LL (-9223372036854775807i64-1)using namespace std;const int N = 1000 + 5;const int mod = 1000000000 + 7;const double eps = 1e-8;int head[N],len;int dfn[N],low[N],dfs_num;//dfn表示遍历深度,low(u)为u或u的子树能够追溯到的最早的栈中节点的次序号int deg[N],ans;struct EdgeNode{int to,next;}edge[N];void add(int i,int j){edge[len].to=j;edge[len].next=head[i];head[i]=len++;} void init(){mem(deg,0),mem(dfn,0),mem(low,0),mem(head,-1),ans=len=dfs_num=0;}void tarjan(int x,int from){dfn[x]=low[x]=++dfs_num;for(int i=head[x];i!=-1;i=edge[i].next){int temp=edge[i].to;if(temp==from) continue;if(!dfn[temp]){tarjan(temp,x);low[x]=min(low[x],low[temp]);}else{low[x]=min(dfn[temp],low[x]);}} }void solve(int n){for(int i=1;i<=n;i++){if(!dfn[i]){tarjan(i,-1); }}for(int i=1;i<=n;i++){for(int k=head[i];k!=-1;k=edge[k].next){int temp=edge[k].to;//不属于同一个边连通分量 if(low[i]!=low[temp]){deg[low[i]]++;}}} //这里的i表示low[] for(int i=1;i<=n;i++){if(deg[i]==1){ans++;}}ans=(ans+1)/2;}int main(){int n,m,u,v;char a;while(~scanf("%d%d",&n,&m)){init();for(int i=1;i<=m;i++){scanf("%d%d",&u,&v);add(u,v);add(v,u);}solve(n);printf("%d\n",ans);}return 0;}


阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 新注册的微信号显示账号异常怎么办 注册公众号说邮箱被占用了怎么办 向钱贷登录手机号换了怎么办 qq号绑定的手机号码换了怎么办 用手机号注册的支付宝换号了怎么办 支付宝转的账户手机号消号了怎么办 激活微信账号手机号写错了怎么办 大学试卷没有写名字和考号怎么办 公司被注销了公众号还想要怎么办 公司认证的公众号公司注销了怎么办 信而富注册手机号码不用了怎么办 信而富本时段额度已放完怎么办 知道qq号密码账号忘了怎么办 扣扣绑定的手机号被别人用了怎么办 我的手机号被别人绑定了快手怎么办 微信密码忘记了没绑定手机号怎么办 扣扣绑定银行卡忘记密码了怎么办 扣扣忘记密码了又换手机号了怎么办 微信订阅号里有删除后的信息怎么办 申请微信公众号邮箱已被占用怎么办 公众号验证没有对公账户怎么办 qq密码忘记了怎么办手机绑定没有 我的扣扣怎么申诉都找不回来怎么办 装修装的不好又没有签合同怎么办 日本免税的零食不小心拆了怎么办 闲鱼同意买家退货了买家不退怎么办 手机里淘宝钱付了不发货怎么办 百度云下载手机储存空间不足怎么办 苹果8的照片储存空间满了怎么办 为什么下载的软件已停止运行怎么办 苹果手机刷机忘记注册邮箱了怎么办 刺激战场模拟器注册已达上限怎么办 用模拟器玩刺激战场注册上限怎么办 微信解除实名认证后退款怎么办 苹果为什么qq收消息有延迟怎么办 qq忘记密码手机号也换了怎么办 扣扣空间圈人时照片服务错误怎么办 删了qq好友怎么找回来怎么办 苹果5s语音控制打开了怎么办 lv迷你水桶包肩带长了怎么办 在香港买个lv包包过海关怎么办