[USACO5.3]校园网Network of Schools 强连通分量

来源:互联网 发布:天刀公子羽数据 编辑:程序博客网 时间:2024/06/07 02:02
#include <iostream>#include <cstring>using namespace std;const int MAXN = 100+5;int g[MAXN][MAXN], dfn[MAXN], num[MAXN] , a[MAXN][MAXN], n, m, scc, cnt;int rd[MAXN],cd[MAXN];void dfs(int k){    num[k] = 1;    for(int i=1; i<=n; i++)        if(g[k][i] && !num[i])            dfs(i);    dfn[++cnt] = k; }void ndfs(int k){    num[k] = scc;       for(int i=1; i<=n; i++)        if(g[i][k] && !num[i])             ndfs(i);}void kosaraju(){    int i, j;    for(i=1; i<=n; i++)                if(!num[i])            dfs(i);    memset(num, 0, sizeof num);             for(i=n; i>=1; i--)        if(!num[dfn[i]]){            scc++;            ndfs(dfn[i]);         }    if(scc==1){cout<<1<<endl<<0<<endl;return;}    for(i=1; i<=n; i++)    for(j=1; j<=n; j++)    if(g[i][j])a[num[i]][num[j]]=1;        for(i=1; i<=scc; i++)    for(j=1; j<=scc; j++)    if(i!=j && a[i][j]){rd[j]++;cd[i]++;}int ans1=0,ans2=0;for(i=1; i<=scc; i++){if(rd[i]==0)ans1++;if(cd[i]==0)ans2++;}cout<<ans1<<endl;if(ans1>ans2)ans2=ans1;cout<<ans2<<endl;    }int main(){    int i, j, k;    cin>>n;    for(i=1;i<=n;i++){while(cin>>k){if(k==0)break;g[i][k]=1;}}        kosaraju();    return 0;}

原创粉丝点击