标签:
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4384 Accepted Submission(s): 1556
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<stack> #include<vector> using namespace std; #define mem(x,y) memset(x,y,sizeof(x)) const int INF=0x3f3f3f3f; const double PI=acos(-1.0); const int MAXN=20010; int scc,dfs_blocks; int dfn[MAXN],low[MAXN],Instack[MAXN],in[MAXN],out[MAXN],sc[MAXN]; stack<int>S; vector<int>vec[MAXN]; void initial(){ scc=0;dfs_blocks=0; mem(dfn,0);mem(low,0);mem(Instack,0);mem(in,0);mem(out,0);mem(sc,0); while(!S.empty())S.pop(); for(int i=0;i<MAXN;i++)vec[i].clear(); } void targin(int u,int fa){ S.push(u); Instack[u]=1; dfn[u]=low[u]=++dfs_blocks; for(int i=0;i<vec[u].size();i++){ int v=vec[u][i]; if(!dfn[v]){ targin(v,u); low[u]=min(low[u],low[v]); } else if(Instack[v]){ low[u]=min(low[u],dfn[v]); } } if(low[u]==dfn[u]){ scc++; while(1){ int v=S.top(); S.pop(); Instack[v]=0; sc[v]=scc; if(u==v)break; } } } int main(){ int T,m,n,x,y; scanf("%d",&T); while(T--){ initial(); scanf("%d%d",&n,&m); while(m--){ scanf("%d%d",&x,&y); vec[x].push_back(y); } for(int i=1;i<=n;i++){ if(!dfn[i])targin(i,-1); } for(int i=1;i<=n;i++){ for(int j=0;j<vec[i].size();j++){ int v=vec[i][j]; if(sc[i]!=sc[v])in[sc[v]]++,out[sc[i]]++; } } int sumin=0,summa=0; // printf("%d\n",scc); if(scc==1){ puts("0");continue; } for(int i=1;i<=scc;i++){ if(in[i]==0)sumin++; if(out[i]==0)summa++; } printf("%d\n",max(sumin,summa)); } return 0; }
Proving Equivalences(加多少边使其强联通)
标签:
原文地址:http://www.cnblogs.com/handsomecui/p/4918879.html