A

来源:互联网 发布:单片机实验报告总结 编辑:程序博客网 时间:2024/06/10 14:18
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <cmath>#include <vector>#include <stack>using namespace std;int n, m;vector<int> g[101];bool flag[101];int dfn[101], f[101], low[101];int cnt, N;stack<int> s;void tarjan(int u){    dfn[u] = low[u] = ++cnt;    flag[u] = true;    s.push(u);    for (int i = 0; i < g[u].size(); i++)    {        int v = g[u][i];        if (!dfn[v])        {            tarjan(v);            low[u] = min(low[u], low[v]);        }        else if (flag[v] && dfn[v] < low[u])            low[u] = dfn[v];    }    if (low[u] == dfn[u])    {        N++;        int v;        do        {            v = s.top(); s.pop();            flag[v] = false;            f[v] = N;        }        while (u != v);    }}int main(){    while (~scanf("%d", &n))    {        for (int i = 1; i <= n; i++)            g[i].clear();        for (int x, i = 1; i <= n; i++)            while (scanf("%d", &x), x)                g[i].push_back(x);        memset(dfn, 0, sizeof(dfn));        memset(low, 0, sizeof(low));        cnt = 0, N = 0;        for (int i = 1; i <= n; i++)            if (!dfn[i])                tarjan(i);        if (N == 1)        {            printf("1\n0\n");            continue;        }        int in[101] = {0}, out[101] = {0};        for (int i = 1; i <= n; i++)            for (int j = 0; j < g[i].size(); j++)                if (f[i] != f[g[i][j]])                {                    in[f[i]]++;                    out[f[g[i][j]]]++;                }        int x = 0, y = 0;        for (int i = 1; i <= N; i++)        {            if (!in[i]) x++;            if (!out[i]) y++;        }        printf("%d\n%d\n", y, max(x, y));    }    return 0;}