题意:我的英语可是一流的。。。(水)。。。没看懂题,看图看明白的。输出出度为0的团的所有元素。(猜的。。过了,说明就猜对了)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <stack> using namespace std; const int INF = 0x3f3f3f3f; const int N = 50009; const int M = N*N; struct LT{ int nex,to; }L[N]; int F[N],cnt; void add(int f,int t) { L[cnt].nex = F[f]; L[cnt].to = t; F[f] = cnt++; } int n,m; int dfn[N],low[N],col[N],color,ind; bool post[N]; stack<int> S; void tarjan(int k) { dfn[k] = low[k] = ind++; post[k] = true; S.push(k); for(int i=F[k];i;i=L[i].nex) { int to = L[i].to; if(!dfn[to]) { tarjan(to); low[k] = min(low[k],low[to]); }else if(post[to]&&low[k]>dfn[to]) { low[k] = dfn[to]; } } if(low[k]==dfn[k]) { color++;int i; for(i=S.top(),S.pop();i!=k;i=S.top(),S.pop()) { col[i] = color,post[i] = false; } col[i]=color,post[i] = false; } } bool ou[N]; void solve() { memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(ou,false,sizeof(ou)); color = 1;ind = 1; for(int i =1;i<=n;i++) if(!dfn[i]) tarjan(i); for(int i=1;i<=n;i++) { for(int j=F[i];j;j=L[j].nex) { if(col[i]!=col[L[j].to]) { ou[col[i]]=true; } } } bool o = false; for(int i=1;i<=n;i++) if(!ou[col[i]]) { if(o) printf(" ");o = true; printf("%d",i); } printf("\n"); } int main() { freopen("in.txt","r",stdin); while(~scanf("%d",&n)&&n) { scanf("%d",&m); memset(F,0,sizeof(F));cnt =1; int f,t; for(int i=0;i<m;i++) { scanf("%d%d",&f,&t); add(f,t); } solve(); } return 0; }