常出现

许诺  •  2个月前


常出现的AC

#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_set>       //你肯定没见过这个库(最好删掉这个注释,不然你就喜了)

using namespace std;

void dfs1(int u, vector& visited, vector<vector>& graph, vector& post_order) {

if (visited[u]) return;
visited[u] = true;
for (int v : graph[u]) {
    dfs1(v, visited, graph, post_order);
}
post_order.push_back(u);

}

void dfs2(int u, vector& visited, vector<vector>& graphT, vector& component, vector& id, int component_id) {

if (visited[u]) return;
visited[u] = true;
component.push_back(u);
id[u] = component_id;
for (int v : graphT[u]) {
    dfs2(v, visited, graphT, component, id, component_id);
}

}

int main() {

int N, M;
cin >> N >> M;
vector<vector<int>> graph(N + 1);
vector<vector<int>> graphT(N + 1);
for (int i = 0; i < M; i++) {
    int A, B;
    cin >> A >> B;
    graph[A].push_back(B);
    graphT[B].push_back(A);
}

vector<bool> visited(N + 1, false);
vector<int> post_order;
for (int u = 1; u <= N; u++) {
    if (!visited[u]) {
        dfs1(u, visited, graph, post_order);
    }
}

reverse(post_order.begin(), post_order.end());
fill(visited.begin(), visited.end(), false);
vector<int> id(N + 1, -1);
vector<int> sizes;
int component_id = 0;

for (int u : post_order) {
    if (!visited[u]) {
        vector<int> component;
        dfs2(u, visited, graphT, component, id, component_id);
        sizes.push_back(component.size());
        component_id++;
    }
}

vector<unordered_set<int>> out_edges(component_id);
for (int u = 1; u <= N; u++) {
    for (int v : graph[u]) {
        int x = id[u];
        int y = id[v];
        if (x != y) {
            out_edges[x].insert(y);
        }
    }
}

int zero_out_count = 0;
int result = 0;
for (int i = 0; i < component_id; i++) {
    if (out_edges[i].empty()) {
        zero_out_count++;
        result = sizes[i];
    }
}

if (zero_out_count == 1) {
    cout << result << endl;
} else {
    cout << 0 << endl;
}

return 0;

}


评论:

请先登录,才能进行评论