社区讨论

不涉及算法的一个纯语法问题

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mhjhwt4c
此快照首次捕获于
2025/11/04 02:50
4 个月前
此快照最后确认于
2025/11/04 02:50
4 个月前
查看原帖
rt,dfs跑循环的时候为什么这个代码 h[u]=0h[u] = 0 的时候还会继续循环啊,而且 ii 甚至不等于 h[u]h[u] 好可怕。(比如说你把样例1输进去然后观察倒数第三行) 求助
CPP
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5, M = 1e5 + 5;
int n, m;
int idx, rd[N], cd[N], h[N], e[M], ne[M];
stack<int> s;
struct node{
	int u, v;
	bool operator < (const node &t) const{
		if(u == t.u) return v < t.v;
		return u < t.u;
	}
}p[N];
void add(int u, int v) {
	e[++idx] = v, ne[idx] = h[u], h[u] = idx;
	rd[v]++, cd[u]++;
}
void dfs(int u) {
	for(int i = h[u]; i; i = ne[i]) {
		cout<<i<<" "<<h[u]<<endl;
		h[u] = ne[i]; //每次走完,将 h[u] 改为下一条边
		printf("%d %d %d\n", u, e[i], h[u]);
		dfs(e[i]); 
	}
	s.push(u);
}
int main() {
	scanf("%d %d", &n, &m);
	for(int i = 1; i <= m; i++) {
		int u, v;
		scanf("%d %d", &p[i].u, &p[i].v);
	}
	int c = 0, r = 0, st = 1; // c-出度比入度大1的点的个数,r同理 
	for(int i = 1; i <= n; i++) {
		if(abs(cd[i] - rd[i]) > 1) {
			printf("No");
			return 0;
		}
		if(cd[i] - rd[i] == 1) {
			c++;
			st = i;
		}else if(rd[i] - cd[i] == 1) r++;
	} 
	if((c == 0 && r == 0) || (c == 1 && r == 1)) {
		sort(p+1, p+1+m);
		for(int i = 1; i <= m; i++) add(p[i].u, p[i].v);
		dfs(st);
		while(!s.empty()) {
			printf("%d ", s.top());
			s.pop();
		}
	}else {
		printf("No");
		return 0;
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...