社区讨论

求助 为什么洛谷上 RE 本地能过 在线ide也能过

P5022[NOIP 2018 提高组] 旅行参与者 2已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mi7d1mqk
此快照首次捕获于
2025/11/20 19:41
4 个月前
此快照最后确认于
2025/11/20 19:41
4 个月前
查看原帖
要是NOIP也被卡就van了啊
CPP
#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;

const int maxn = 12345;
struct node
{
	int f, t;
}e[maxn<<1];
struct node2
{
	int f, t;
}f[maxn<<1];
int headx[maxn], nxtx[maxn << 1] , sot[maxn] , huan[maxn];
int head[maxn], nxt[maxn << 1], used[maxn] , cant[maxn];
int n, m, tot , tot2 , stx , d1 = 1e9 , d2 = 1e9;
inline void buildnode(int a , int b)
{
	tot++;
	e[tot].f = a;
	e[tot].t = b;
	nxt[tot] = head[a];
	head[a] = tot;
}
inline void buildnode2(int a, int b)
{
	tot2++;
	f[tot2].f = a;
	f[tot2].t = b;
	nxtx[tot2] = headx[a];
	headx[a] = tot2;
}
inline int read()
{
	int x = 0, f = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }
	while (ch >= '0' && ch <= '9') { x = x * 10 + ch - 48; ch = getchar(); }
	return x * f;
}
inline void dfs1(int x , int fat)
{
	int cnt = 0;
	for (int i = head[x]; i; i = nxt[i])
	{
		if(cant[i]) continue;
		int u = e[i].t;
		if (u == fat) continue;
		sot[++cnt] = u;
	}
 	sort(sot + 1, sot + cnt + 1);
	for (int i = cnt; i >= 1; i --) buildnode2(x, sot[i]);
	for (int i = head[x]; i; i = nxt[i])
	{
		if(cant[i]) continue;
		int u = e[i].t;
		if (u == fat) continue;
		dfs1(u, x);
	}
}
inline void dfs2(int x, int fat)
{
	printf("%d ", x);
	for (int i = headx[x]; i; i = nxtx[i])
	{
		int u = f[i].t;
		if (u == fat) continue;
		dfs2(u, x);
	}
}
inline int dfs(int x , int fat)
{
	used[x] = 1;
	for(int i = head[x] ; i ; i = nxt[i])
	{
		int u = e[i].t;
		if(u == fat) continue;
		if(used[u])
		{
			huan[x] = 1;
			stx = u;
			return u;
		}
		int k = dfs(u , x);
		if(k && k != u) 
		{
			huan[x] = 1;
			return k;
		}
	}
	return 0;
}
inline void solve1()
{
	dfs1(1, 0);
	dfs2(1 , 0);
}
inline void dff(int x , int fat)
{
	for(int i = head[x] ; i ; i = nxt[i])
	{
		int u = e[i].t;
		if(u == fat) continue;
		if(huan[u] && u > d2) 
		{
			cant[i] = 1;
			if(i % 2 == 0) cant[i - 1] = 1;
			else cant[i + 1] = 1;
			return;
		}
	}
}
inline void solve2()
{
	dfs(1 , 0);
	for(int i = head[stx] ; i ; i = nxt[i])
	{
		int u = e[i].t;
		if(huan[u] && u < d1) d2 = d1 , d1 = u;
		else if(u < d2) d2 = u;
 	}
 	dff(d1 , stx);
 	dfs1(1 , 0);
 	dfs2(1 , 0);
}
int main()
{
	n = read(); m = read();
	for (int i = 1; i <= m; i++)
	{
		int a, b;
		a = read();  b = read();
		buildnode(a, b);
		buildnode(b, a);
	}
	if (m == n - 1) solve1();
	if (m == n) solve2();
}

回复

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

正在加载回复...