【HAOI2006】【luogu2341】受欢迎的牛

//即缩点拓扑序以后最后一个SCC的大小
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#define maxn 10010
using namespace std;
vector<int>G[maxn],rG[maxn],cmp[maxn],vs;
int vis[maxn], cnt, flag;
void dfs(int u){
    vis[u] = 1;  
    for(int i = 0; i < G[u].size(); i++)
        if(!vis[G[u][i]])dfs(G[u][i]);
    vs.push_back(u);
}
void rdfs(int u){
    vis[u] = 1; 
    if(!flag)cmp[cnt].push_back(u);
    for(int i = 0; i < rG[u].size(); i++)
        if(!vis[rG[u][i]])rdfs(rG[u][i]);
}
int main(){
    int n, m;
    cin>>n>>m;
    for(int i = 1; i <= m; i++){
        int x, y;  cin>>x>>y;
        G[x].push_back(y);
        rG[y].push_back(x);
    }
    for(int i = 1; i <= n; i++)
        if(!vis[i])dfs(i);
    memset(vis, 0, sizeof vis);
    for(int i = n-1; i >= 0; i--)
        if(!vis[vs[i]]){ cnt++;  rdfs(vs[i]); }
    flag = 1;
    memset(vis, 0, sizeof vis);
    rdfs(cmp[cnt][0]);
    for(int i = 1; i <= n; i++)
        if(!vis[i])cmp[cnt].resize(0);
    cout<<cmp[cnt].size()<<"
";
    return 0;
}
原文地址:https://www.cnblogs.com/gwj1314/p/9444885.html