标签:
http://poj.org/problem?id=3177
题目大意:给你几个点和几条边 求你能加几条边 就可以让每一个点到达任意点都有两种方法。
Description
Input
Output
Sample Input
7 7 1 2 2 3 3 4 2 5 4 5 5 6 5 7
Sample Output
2
Hint
1 2 3Building new paths from 1 to 6 and from 4 to 7 satisfies the conditions.
+---+---+
| |
| |
6 +---+---+ 4
/ 5
/
/
7 +
1 2 3Check some of the routes:
+---+---+
: | |
: | |
6 +---+---+ 4
/ 5 :
/ :
/ :
7 + - - - -
#include<iostream> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<algorithm> #include<stack> #include<queue> #include<vector> using namespace std; #define N 20000 int low[N],dfn[N],n,fa[N],Stack[N],belong[N],Is[N],aa[N]; int Time,top,ans; vector<vector <int> >G; void Inn() { G.clear(); G.resize(n+1); memset(low,0,sizeof(low)); memset(dfn,0,sizeof(dfn)); memset(fa,0,sizeof(fa)); memset(belong,0,sizeof(belong)); memset(Stack,0,sizeof(Stack)); memset(Is,0,sizeof(Is)); memset(aa,0,sizeof(aa)); Time=top=ans=0; } void Tarjin(int u,int f) { dfn[u]=low[u]=++Time; Stack[top++]=u; Is[u]=1; fa[u]=f; int len=G[u].size(),v; for(int i=0; i<len; i++) { v=G[u][i]; if(!dfn[v]) { Tarjin(v,u); low[u]=min(low[u],low[v]); } else if(f!=v) low[u]=min(low[u],dfn[v]); } if(dfn[u]==low[u]) { ans++; do { v=Stack[--top]; belong[v]=ans; Is[v]=0; }while(v!=u); } } int main() { int m,a,b,i,sum; while(scanf("%d %d",&n,&m)!=EOF) { sum=0; Inn(); for(i=1;i<=m;i++) { scanf("%d %d",&a,&b); G[a].push_back(b); G[b].push_back(a); } for(i=1;i<=n;i++) { if(!dfn[i]) Tarjin(i,0); } for(i=1;i<=n;i++) { int v=fa[i]; if(belong[i]!=belong[v]&&v!=0) { aa[belong[i]]++; aa[belong[v]]++; } } for(i=1;i<=ans;i++) { if(aa[i]==1) sum++; } printf("%d\n",(sum+1)/2); } return 0; }
Redundant Paths-POJ3177(强连通缩点)
标签:
原文地址:http://www.cnblogs.com/linliu/p/4918253.html