社区讨论

玄学事件

P7771【模板】欧拉路径参与者 4已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@lo1qrmhf
此快照首次捕获于
2023/10/23 01:27
2 年前
此快照最后确认于
2023/11/03 02:06
2 年前
查看原帖
两份代码唯一不同之处:
AC:
CPP
void dfs(int x){ int i;
	while(head[x])
		i = head[x], head[x] = e[i].nxt, dfs(e[i].v);
	stk.push(x);
}
CPP
void 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 条回复,欢迎继续交流。

正在加载回复...