社区讨论
建议加强数据
P2341[USACO03FALL / HAOI2006] 受欢迎的牛 G参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mdsbncge
- 此快照首次捕获于
- 2025/08/01 12:26 7 个月前
- 此快照最后确认于
- 2025/08/01 12:26 7 个月前
rt,我 tarjan 板子都错了,依然AC。
如下第 行,
CPP如下第 行,
ins[v] 写成了 ins[u]#include <bits/stdc++.h>
using namespace std;
const int M = 5e4 + 5;
const int N = 1e4 + 5;
int n, m;
vector<int> e[N];
int dfn[N], low[N], tim, Stack[N], top, belong[N], siz[N], fu[M], fv[M], dout[N];
bool ins[N];
void tarjan(int u, int fa) {
dfn[u] = low[u] = ++tim;
Stack[++top] = u;
ins[u] = 1;
for(int v : e[u]) {
if(!dfn[v]) {
tarjan(v, u);
low[u] = min(low[u], low[v]);
}
else if(ins[u]) low[u] = min(low[u], dfn[v]);
}
if(low[u] == dfn[u]) {
while(Stack[top + 1] != u) {
siz[u]++;
belong[Stack[top]] = u;
ins[Stack[top--]] = 0;
}
}
}
void shrink_node() {
for(int i = 1; i <= m; ++i) {
int du = belong[fu[i]], dv = belong[fv[i]];
if(du != dv)
dout[du]++;
}
}
int main() {
cin >> n >> m;
for(int i = 1; i <= m; ++i) {
cin >> fu[i] >> fv[i];
e[fu[i]].push_back(fv[i]);
}
for(int i = 1; i <= n; ++i) {
if(!dfn[i]) {
top = 0;
tarjan(i, 0);
}
}
shrink_node();
int cnt = 0, ans;
for(int i = 1; i <= n; ++i) {
if(dout[i] == 0 && belong[i] == i) {
cnt++;
ans = siz[i];
}
}
if(cnt == 1) cout << ans;
else cout << 0;
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...