差点被打脸了
题目以及邻接矩阵的做法
代码
#include <cstdio>
#include <algorithm>
using namespace std;
struct node{int x,y,next,next1;}e[2001];
bool v1[101],v2[101]; int inn,ans,c,f[101],ls[101];
int n,m,ind[101],in[101],out[101],ls1[101],oun;
void add(int x,int y){e[++m].x=x; e[m].y=y; e[m].next1=ls1[e[m].y]; ls1[e[m].y]=m; e[m].next=ls[e[m].x]; ls[e[m].x]=m;}
void dfs1(int x){
v1[x]=1; int t=ls[x];
while (t){
if (!v1[e[t].y]) dfs1(e[t].y);
t=e[t].next;
}
f[++c]=x;
}
void dfs2(int x){
v2[x]=1; ind[x]=ans; int t=ls1[x];
while (t){
if (!v2[e[t].x]) dfs2(e[t].x);
t=e[t].next1;
}
}
void kosaraju(){
for (int i=1;i<=n;i++){
int t=ls[i];
while (t){
if (ind[i]!=ind[e[t].y]) in[ind[e[t].y]]++,out[ind[i]]++;
t=e[t].next;
}
}
for (int i=1;i<=ans;i++) inn+=(!in[i]),oun+=(!out[i]);
printf("%d\n%d",inn,max(inn,oun));
}
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++){
int k=i;
while (scanf("%d",&k)&&k) add(i,k);
}
for (int i=1;i<=n;i++) if (!v1[i]) dfs1(i);
for (int i=c;i>=1;i--)
if (!v2[f[i]]) ans++,dfs2(f[i]);
if (ans==1) printf("1\n0"); else kosaraju();
return 0;
}