标签:
Description
Input
Output
Sample Input
Sample Output
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cstdlib> #include<cmath> #include<algorithm> #include<queue> #include<vector> #include<stack> #include<set> #include<map> using namespace std; vector<int> e[5005],mp[5005]; stack<int> s; int n,m; int Dfs[5005],use[5005],low[5005],dp[5005],in[5005],cnt[5005]; int isstack[5005],vis[5005]; int newflag,top; void init() { memset(Dfs,0,sizeof(Dfs)); memset(use,0,sizeof(use)); memset(low,0,sizeof(low)); memset(dp,0,sizeof(dp)); memset(in,0,sizeof(in)); memset(isstack,0,sizeof(isstack)); memset(cnt,-1,sizeof(cnt)); newflag=0,top=0; while(!s.empty()) s.pop(); for(int i=0;i<n;i++) e[i].clear(),mp[i].clear(); } void tarjan(int u) { Dfs[u]=low[u]=++top; isstack[u]=1; s.push(u); for(int i=0;i<e[u].size();i++) { int v=e[u][i]; if(!Dfs[v]) { tarjan(v); low[u]=min(low[u],low[v]); } else if(isstack[v]) { low[u]=min(low[u],Dfs[v]); } } if(low[u]==Dfs[u]) { newflag++; int x; do { x=s.top(); s.pop(); use[x]=newflag; isstack[x]=0; dp[newflag]++; }while(x!=u); } } int dfs(int x) { int sum=dp[x]; vis[x]=1; for(int i=0;i<mp[x].size();i++) { int v=mp[x][i]; if(!vis[v]) sum+=dfs(v); } return sum; } int main() { int tt,cas=1; scanf("%d",&tt); while(tt--) { init(); scanf("%d%d",&n,&m); for(int i=0;i<m;i++) { int x,y; scanf("%d%d",&x,&y); e[x].push_back(y); } for(int i=0;i<n;i++) { if(!Dfs[i]) tarjan(i); } for(int i=0;i<n;i++) { for(int j=0;j<e[i].size();j++) { if(use[i]!=use[e[i][j]]) { mp[use[e[i][j]]].push_back(use[i]); in[use[i]]++; } } } int ans=0; for(int i=1;i<=newflag;i++) { if(in[i]==0) { memset(vis,0,sizeof(vis)); cnt[i]=dfs(i)-1; ans=max(ans,cnt[i]); } } int k; printf("Case %d: %d\n",cas++,ans); for(k=0;k<n;k++) { if(cnt[use[k]]==ans) { printf("%d",k); break; } } for(++k;k<n;k++) { if(cnt[use[k]]==ans) printf(" %d",k); } printf("\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/a972290869/p/4436367.html