CODEVS 1332 上白泽慧音

来源:互联网 发布:松子deluxe 知乎 编辑:程序博客网 时间:2024/06/10 19:23
//top++//强连通分量的数组要和点的数组一样大 #include<cstdio>#include<iostream>#include<vector>using namespace std;const int maxn = 5050;vector<int> g[5050];int low[maxn], stack[maxn], instack[maxn], dfn[maxn], sum[maxn], belong[maxn];int bcnt, top, index, ans, mark;void in(int a, int b){    g[a].push_back(b);}void tarjan(int u){    stack[top++] = u;    instack[u] = 1;    dfn[u] = low[u] = ++index;    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(instack[v])//访问过且在栈内             low[u] = min(low[u], dfn[v]);    }    if(low[u] == dfn[u]){        int v;        bcnt++;        while(u != v){            v = stack[--top];            belong[v] = bcnt;            instack[v] = 0;            sum[bcnt]++;        }     }}int main(){    int n, m;    cin >> n >> m;    for(int i = 1, a, b, y; i <= m; i++){        cin >> a >> b >> y;        in(a, b);        if(y == 2)  in(b, a);    }    for(int i = 1; i <= n; i++)        if(!dfn[i]) tarjan(i);    for(int i = 1; i <= n; i++){//通过从小到大遍历找到最大的字典序最小的强连通分量         if(sum[belong[i]] > ans){            ans = sum[belong[i]];            mark = i;        }    }    cout << ans << endl;    for(int i = 1; i <= n; i++){        //cout << belong[i] << "/ ";        if(belong[i] == belong[mark])            cout << i << " ";    }    cout << endl;    return 0;}
0 0
原创粉丝点击