许诺 • 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;
}
评论:
请先登录,才能进行评论