标签:addition ext center text near nal matrix 证明 finally
2 4 0 3 2 1 2 1 3
4 2
#include<bits/stdc++.h> using namespace std; int n,T,m,index,team_num; int low[20005],dfn[20005],team[20005],in[20005],out[20005]; bool instack[20005]; vector<int> mp[20005]; stack<int> S; void Tarjan ( int u ) { dfn[u]=low[u]=++index; S.push(u); instack[u]=1; for ( int i=0;i<mp[u].size();i++) { int v=mp[u][i]; if (!dfn[v]) { Tarjan (v) ; low[u]=min(low[u],low[v]); } else if (instack[v]) low[u]=min(low[u],dfn[v]);//是否在栈中 } if (dfn[u]==low[u]) //构成强连通分量 { team_num++; //组数 while (1) //同一组标号 { int v=S.top(); S.pop(); instack[v]=0; team[v]=team_num; if (v==u) break; } } } void dfs() { memset(team,0,sizeof(team)); memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(instack,0,sizeof(instack)); team_num=0; index=0; for(int i=1;i<=n;i++) if (!dfn[i]) Tarjan(i); } int main() { scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) mp[i].clear(); for(int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); mp[x].push_back(y); } dfs(); //缩点 /*for(int i=1;i<=n;i++) printf("%d:%d\n",i,team[i]);*/ for(int i=1;i<=team_num;i++) in[i]=out[i]=0; for(int i=1;i<=n;i++) for(int j=0;j<mp[i].size();j++) { if (team[i]!=team[mp[i][j]]) { out[ team[i] ]++; in[ team[mp[i][j]] ]++; } } int innum=0,outnum=0; for(int i=1;i<=team_num;i++) { if (!in[i]) innum++; if (!out[i]) outnum++; } if (team_num==1) printf("0\n"); else printf("%d\n",max(innum,outnum)); } return 0; }
HDU 2767 Proving Equivalences (Tarjan)
标签:addition ext center text near nal matrix 证明 finally
原文地址:http://www.cnblogs.com/stepping/p/7667809.html