社区讨论
求助 为什么洛谷上 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 条回复,欢迎继续交流。
正在加载回复...