找出各个顶点所属的连通分量,将连通分量的点看作一个点,求这些顶点入度为0的个数和出度0的个数,取最大的即可。
1 #include2 #include 3 #include 4 #include 5 #define maxn 102 6 using namespace std; 7 vector G[maxn],G2[maxn]; 8 vector s;//栈 9 int vis[maxn],10 sccno[maxn], //标记顶点所属的连通分量11 scc_cnt; //记录有几个强连通分量12 void dfs1(int u)13 {14 if(vis[u]) return ; //顶点遍历过则返回15 vis[u] = 1;16 for(int i=0; i =0; i--)if( !sccno[s[i]] ){ //找强连通分量,找过了则不用找了34 scc_cnt++; //记录找到连通分量的个数35 dfs2(s[i]);36 }37 }38 int main()39 {40 //freopen("in.txt","r",stdin);41 int i,j,T,n,u,ver;42 int in0[maxn],out0[maxn];43 cin>>T;44 while(T--)45 {46 cin>>n;47 for(i=1; i<=n; i++)48 for(j=1; j<=n; j++){49 cin>>ver;50 if(ver==0)break;51 G[i-1].push_back(ver-1); //原图52 G2[ver-1].push_back(i-1);//逆向图53 }54 find_scc(n); //求连通分量55 for(i=1; i<=scc_cnt; i++)in0[i] = out0[i] = 1;//同一个连通分量所有点看成一个点56 for(u=0; u