poj 3177 Redundant Paths

题目描述:
有F个牧场,1≤F≤5,000,贝茜和她的牧群经常需要从一个牧场迁移到另一个牧场。奶牛
们已经厌烦老是走同一条路,所以它们想再新修一些路,这样它们从一个牧场迁移到另一个牧场
时总是可以选择至少两条独立的路。现在F个牧场的任何两个牧场之间已经至少有一条路了,奶
牛们需要至少有两条。
给定现有的R条直接连接两个牧场的路,F-1≤R≤10,000,计算至少需要新修多少条直接连
接两个牧场的路,使得任何两个牧场之间至少有两条独立的路。两条独立的路是指没有公共边的
路,但可以经过同一个中间顶点。



本题的意思是给定一个无向连通图,判断最少需要加多少条边,才能使得任意两点之间至少
有两条相互“边独立”的道路。显然,在同一个边双连通分量里的所有点可以等价地看做一个点,
收缩后,新图是一棵树,树的边是原无向图的桥。现在问题转化为“在树中至少添加多少条边能
使图变为边双连通图”。结论是:添加边数= (树中度为1的结点数 + 1) / 2。(就是把度数为一的点两两相连)
// 边双连通 先dfs标记出桥 再dfs求出边双连通 第二次只要保证每次dfs时不经过桥就OK了
// 然后缩点 求各点度数

#include <iostream> #include <algorithm> #include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <string.h> using namespace std; #define MOD 1000000007 #define maxn 20100 #define maxm 5010 struct Edge{ int to; int num; int next; Edge(){}; Edge(int u,int v){to=u;next=v;} }E[maxn]; int V[maxm],num; int pre[maxm]; int dfst,bcc; int belong[maxm]; bool tag[maxn]; void init(int n){ dfst=0; num=0; bcc=0; for(int i=1;i<=n;i++){ V[i]=-1; pre[i]=0; belong[i]=0; } } void add(int u,int v,int m){ E[num].to=v; E[num].num=m; E[num].next=V[u]; V[u]=num++; E[num].to=u; E[num].num=m; E[num].next=V[v]; V[v]=num++; } int dfs(int u,int fa){ int lowu; lowu=pre[u]=++dfst; int v,e; for(e=V[u];e!=-1;e=E[e].next){ v=E[e].to; if(!pre[v]){ int lowv=dfs(v,u); lowu=min(lowu,lowv); if(lowv>pre[u]){ tag[E[e].num]=1; } } else if(v!=fa) lowu=min(lowu,pre[v]); } return lowu; } void dfsbcc(int u){ belong[u]=bcc; int v,e; for(e=V[u];e!=-1;e=E[e].next){ if(tag[E[e].num]) continue; v=E[e].to; if(!belong[v]){ dfsbcc(v); } } } int rc[maxn][2],in[maxm];// 记录边 和 缩点后新节点度数
int main() { int F,R; int u,v; int i,j; while(scanf("%d %d",&F,&R)!=EOF){ init(F); for(i=1;i<=R;i++){ scanf("%d %d",&u,&v); rc[i][0]=u;rc[i][1]=v; add(u,v,i); tag[i]=0; } dfs(1,0); for(i=1;i<=F;i++) if(!belong[i]){ bcc++; dfsbcc(i); } for(i=1;i<=bcc;i++) in[i]=0; for(i=1;i<=R;i++) { u=belong[rc[i][0]]; v=belong[rc[i][1]]; if(u!=v){ in[u]++; in[v]++; } } int ans=0; for(i=1;i<=bcc;i++) if(in[i]==1) ans++; printf("%d\n",(ans+1)/2); } return 0; }

 

posted on 2013-07-22 09:20  江财小子  阅读(234)  评论(0编辑  收藏  举报