板子题
缩点找出入度为0的点 即可
第二问 max(p,q)
#include <bits/stdc++.h> using namespace std ; const int N=103; vector<int> g[N],graph[N]; int n,pool,dfn[N],low[N],in[N],out[N] ; int col[N],cl; stack<int> st ; void tarjan(int x) { dfn[x]=low[x]=++pool; st.push(x); int y,i; for(i=0;i<g[x].size();i++){ y=g[x][i]; if(dfn[y]==0) tarjan(y),low[x]=min(low[x],low[y]); else if(col[y]==0) low[x]=min(low[x],dfn[y]); } if(low[x]==dfn[x]){ ++cl; do{ y=st.top(); st.pop(); col[y]=cl; }while(x!=y); } } signed main(){ int i,j,x,y,c1=0,c2=0; cin>>n; for(i=1;i<=n;i++) while(cin>>j,j) g[i].push_back(j); for(i=1;i<=n;i++) if(dfn[i]==0) tarjan(i); for(i=1;i<=n;i++) for(j=0;j<g[i].size();j++){ x=col[i],y=col[g[i][j]]; if(x!=y) graph[x].push_back(y),in[y]++,out[x]++; } for(i=1;i<=cl;i++){ if(in[i]==0) c1++; if(out[i]==0) c2++; } if(cl==1) cout<<1<<endl<<0; else cout<<c1<<endl<<max(c1,c2); }
标签:int,网络协议,st,push,dfn,low,1515,pool From: https://www.cnblogs.com/towboa/p/17133454.html