板子题
缩点找出入度为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);
}
浙公网安备 33010602011771号