社区讨论
72pts求调
P5049[NOIP 2018 提高组] 旅行 加强版参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhjhbcsr
- 此快照首次捕获于
- 2025/11/04 02:34 4 个月前
- 此快照最后确认于
- 2025/11/04 02:34 4 个月前
CPP
#include <bits/stdc++.h>
#define IAKIOI ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
#define UPB(x, y, z) upper_bound(x + 1, x + y + 1, z) - x
#define LWB(x, y, z) lower_bound(x + 1, x + y + 1, z) - x
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define pre(i, r, l) for (int i = r; i >= l; i--)
#define UNIQUE(x, y) unique(x + 1, x + y + 1)
#define SORT(x, y) sort(x + 1,x + y + 1)
#define pf push_front
#define pb push_back
#define IT iterator
#define lowbit(x) x & (-x)
#define re read()
#define wr(n) write(n)
#define sp putchar(' ')
#define endl puts("")
const int N = 5e5 + 10, INF = 1e9;
const double ecnts = 1e-6;
using namespace std;
#define int long long
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<int, pair<int, int> > piii;
typedef double db;
int read() {
int f = 1, y = 0;
char c = getchar();
while (!isdigit(c)) {
if (c == '-') f = -1;
c = getchar();
}
while (isdigit(c)) {
y = y * 10 + c - '0';
c = getchar();
}
return y * f;
}
void write(int x) {
if(x < 0) putchar('-'), x = -x;
if(x > 9) write(x / 10);
putchar(x % 10 + '0');
}
inline int max(int x, int y) {return x > y ? x : y;}
inline int min(int x, int y) {return x < y ? x : y;}
inline void swap(int &x, int &y) {int t = x;x = y, y = t;}
inline int pow(int x, int y) {
int ans = 1;
while (y) {
if (y & 1) ans *= x;
x *= x, y = y >> 1;
}
return ans;
}
int n, m;
vector<int> g[N];
int in[N];
bool vis[N], flag, used[N];
int F[N];
vector<int> tops;
queue<int> q;
void toposort() {
rep(i, 1, n) {
if (!in[i]) q.push(i);
// sort(g[i].begin(), g[i].end());
}
while (!q.empty()) {
int u = q.front(); q.pop();
used[u] = 1;
for (auto v : g[u]) {
in[v]--;
if (!in[v]) q.push(v);
}
}
rep(i, 1, n) if (!used[i]) F[i] = 1;
}
void dfs(int u, int fa, int X) {
if (vis[u]) return ;
vis[u] = 1;
q.push(u);
priority_queue<int, vector<int>, greater<int> > Q;
for (auto v : g[u]) {
if (v == fa || vis[v]) continue;
Q.push(v);
}
while (!Q.empty()) {
int v = Q.top();
Q.pop();
if (!flag && F[v] && v > X && !Q.empty()) {
flag = 1;
return ;
}
int l = 1e9;
if (!Q.empty() && F[u]) l = -Q.top();
dfs(v, u, l == 1e9 ? X : l);
}
}
signed main() {
IAKIOI
n = re, m = re;
rep(i, 1, m) {
int u = re, v = re;
g[u].push_back(v), g[v].push_back(u);
in[u]++, in[v]++;
}
toposort();
dfs(1, 1, 1e9);
while (!q.empty()) {
wr(q.front()), q.pop(), sp;
}
}
样例2没过居然72pts
回复
共 2 条回复,欢迎继续交流。
正在加载回复...