P2863奶牛舞会(有向图): https://www.luogu.com.cn/problem/P2863

#include <iostream>
#include <vector>
#include <stack>

using namespace std;
vector<int> a[300000];
int low[300000], dfn[300000], cnt, nu, isHave[300000], tt;
bool ins[300000];
stack<int> s;

void sout(int ss) {
	isHave[tt]++;
	ins[ss] = 0;
	s.pop();
}

void dfs(int x, int fa) {
	s.push(x);
	ins[x] = 1;
    dfn[x] = ++nu;
    low[x] = nu;
    for (int to : a[x]) {
        if (!dfn[to]) {
	        dfs(to, x);
	        low[x] = min(low[x], low[to]);
        } else if(ins[to]) low[x] = min(low[x], dfn[to]);
    }
	
    if (dfn[x] == low[x]) {
    	tt++;
    	while (s.top() != x) {
    		sout(s.top());
		}
		sout(x);
		
	}
	
}


int main() {
     int m, n;
     cin >> n >> m;
     for (int i=1;i<=m;i++) {
         int x, y;
         cin >> x >> y;
         a[x].push_back(y);
     }
    for (int i=1;i<=n;i++) {
    	if (!dfn[i]) dfs(i, i);
    }
    for (int i=1;i<=n;i++) {
    	if (isHave[i] > 1) cnt++;
	}
    cout << cnt << endl;
    return 0;
}

未完待续

haihaihai

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注