社区讨论
玄学事件
P7771【模板】欧拉路径参与者 4已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @lo1qrmhf
- 此快照首次捕获于
- 2023/10/23 01:27 2 年前
- 此快照最后确认于
- 2023/11/03 02:06 2 年前
两份代码唯一不同之处:
AC:
CPPAC:
void dfs(int x){ int i;
while(head[x])
i = head[x], head[x] = e[i].nxt, dfs(e[i].v);
stk.push(x);
}
WA:
CPPvoid dfs(int x){
for(int i = head[x]; i; i = e[i].nxt)
head[x] = e[i].nxt, dfs(e[i].v);
stk.push(x);
}
总代码:
CPP#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
int n, m, head[N], cnt[N], op, ed;
struct Edge{
int u, v, nxt;
} e[N];
stack<int> stk;
bool cmp(Edge x, Edge y){ return x.v > y.v; }
void dfs(int x){ int i;
while(head[x])
i = head[x], head[x] = e[i].nxt, dfs(e[i].v);
stk.push(x);
}
int main(){
//freopen("P7771_7.in", "r", stdin);
bool flag = 1;
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; i++){
scanf("%d%d", &e[i].u, &e[i].v);
cnt[e[i].v]++, cnt[e[i].u]--;
}
sort(e + 1, e + m + 1, cmp);
for(int i = 1; i <= m; i++){
e[i].nxt = head[e[i].u];
head[e[i].u] = i;
}
for(int i = 1; i <= n; i++){
if(abs(cnt[i]) > 1){ flag = 0; break; }
if(cnt[i] < 0)
if(op){ flag = 0; break; }
else op = i;
else if(cnt[i] > 0)
if(ed){ flag = 0; break; }
else ed = i;
}
if(!flag){ printf("No"); return 0; }
if(!op) op = ed = 1;
dfs(op);
while(!stk.empty()) printf("%d ", stk.top()), stk.pop();
return 0;
}
对于 WA 的代码的 dfs 部分,我发现 head[x]=0 时 for 循环内 i 不是从 0 开始的,不知道为什么。
回复
共 7 条回复,欢迎继续交流。
正在加载回复...