标签:require else mode getchar cst win term ted limit
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6006 Accepted Submission(s):
2051
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int N=2e4+5,M=5e4+5; typedef long long ll; inline int read(){ char c=getchar();int x=0,f=1; while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();} return x*f; } int n,m,u,v; struct edge{ int v,ne; }e[M]; int h[N],cnt=0; inline void ins(int u,int v){ cnt++; e[cnt].v=v;e[cnt].ne=h[u];h[u]=cnt; } int dfn[N],low[N],belong[N],dfc,scc; int st[N],top=0; void dfs(int u){ dfn[u]=low[u]=++dfc; st[++top]=u; for(int i=h[u];i;i=e[i].ne){ int v=e[i].v; if(!dfn[v]){ dfs(v); low[u]=min(low[u],low[v]); }else if(!belong[v]) low[u]=min(low[u],dfn[v]); } if(low[u]==dfn[u]){ scc++; while(true){ int x=st[top--]; belong[x]=scc; if(x==u) break; } } } void findSCC(){ memset(dfn,0,sizeof(dfn)); memset(belong,0,sizeof(belong)); memset(low,0,sizeof(low)); dfc=scc=top=0; for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i); } int outd[N],ind[N]; void point(){ memset(ind,0,sizeof(ind)); memset(outd,0,sizeof(outd)); for(int u=1;u<=n;u++) for(int i=h[u];i;i=e[i].ne){ int v=e[i].v; if(belong[u]!=belong[v]) outd[belong[u]]++,ind[belong[v]]++; } } int T; int main(){ T=read(); while(T--){ n=read();m=read(); cnt=0; memset(h,0,sizeof(h)); for(int i=1;i<=m;i++){u=read();v=read();ins(u,v);} findSCC(); point(); int cnt1=0,cnt2=0; for(int i=1;i<=scc;i++){ if(ind[i]==0) cnt1++; if(outd[i]==0) cnt2++; } if(scc==1) printf("0\n"); else printf("%d\n",max(cnt1,cnt2)); } }
HDU2767Proving Equivalences[tarjan 缩点]
标签:require else mode getchar cst win term ted limit
原文地址:http://www.cnblogs.com/candy99/p/5989125.html