玄学事件
查看原帖
玄学事件
358971
朦胧_XY楼主2023/8/22 00:41

两份代码唯一不同之处:
AC:

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:

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);
}

总代码:

#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 开始的,不知道为什么。

2023/8/22 00:41
加载中...