社区讨论
缩点板子mle求助
P2341[USACO03FALL / HAOI2006] 受欢迎的牛 G参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lwa9xs1e
- 此快照首次捕获于
- 2024/05/17 14:03 2 年前
- 此快照最后确认于
- 2024/05/17 14:54 2 年前
CPP
#include <bits/stdc++.h>
using i64 = long long;
struct SCC {
int n;
std::vector<std::vector<int>> adj;
std::vector<int> dfn, low, stk, bel;
int cur, cnt;
SCC(){}
SCC(int n) {
init(n);
}
void init(int n) {
this->n = n;
adj.assign(n, {});
dfn.assign(n, -1);
stk.clear();
low.assign(n, -1);
bel.assign(n, -1);
}
void addEdge(int u, int v) {
adj[u].push_back(v);
}
void dfs(int x) {
dfn[x] = low[x] = cur++;
stk.push_back(x);
for (auto y: adj[x]) {
if(dfn[y] == -1) {
dfs(y);
low[x] = std::min(low[x], low[y]);
}
else if(bel[y] == -1) {
low[x] = std::min(low[x], dfn[y]);
}
}
if(dfn[x] == low[x]) {
int y;
do{
y = stk.back();
bel[y] = cnt;
stk.pop_back();
} while(x != y);
++cnt;
}
}
std::vector<int> work() {
for (int i = 0; i < n; ++i) {
if(dfn[i] == -1) dfs(i);
}
return bel;
}
};
int main() {
std::cin.tie(nullptr)->sync_with_stdio(false);
int n, m;
std::cin >> n >> m;
SCC g(n);
for (int i = 0; i < m; ++i) {
int u, v;
std::cin >> u >> v;
--u, --v;
g.addEdge(u, v);
}
auto bel = g.work();
std::vector<int> d(g.cnt), sz(g.cnt);
for (int i = 0; i < n; ++i) {
++sz[bel[i]];
for (auto y : g.adj[i]) {
if(bel[i] == bel[y]) continue;
++d[bel[i]];
}
}
i64 ans = 0;
for (int i = 0; i < g.cnt; ++i) {
if (d[i]) continue;
if (ans != 0) {
ans = 0;
break;
}
ans = sz[i];
}
std::cout << ans << '\n';
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...