graph

本文最后更新于:3 years ago

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include<bits/stdc++.h>
#include <ostream>

using namespace std;
typedef long long ll;
#define YES cout << "YES" << endl
#define NO cout << "NO" << endl
#define debug() cout.flush()
const ll MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int MAXN = 4e6 + 5e3;

inline void init() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
}

struct Edge{
int to, nxt;
}e[MAXN];

int cnt, head[MAXN], vis[MAXN], deep[MAXN], n, m, q;

inline void add(int from, int to) {
e[cnt] = Edge{to, head[from]};
head[from] = cnt++;
}

inline void dfs (int root) {
cout << root << endl;
for (int i =head[root]; i != -1; i = e[i].nxt) {
if (!vis[e[i].to] && deep[e[i].to] == deep[root] + 1) {
vis[e[i].to] = 1;
dfs(e[i].to);
}
}
}

inline void solve() {
cin >> n >> m;
cnt = 1;
for (int i = 1; i <= n; i++) {
head[i] = -1;
deep[i] = 0;
}
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
add(u, v);
add(v, u);
}
cin >> q;
function<void (int)> bfs = [&] (int root) {
for (int i = 1; i <= n; i++) vis[i] = 0;
vis[q] = 1;
queue<pair<int, int> >que;
que.push(make_pair(q, 1));
deep[q] = 1;
while (!que.empty()) {
pair<int, int> front = que.front();
que.pop();
for (int i =head[front.first]; i != -1; i = e[i].nxt) {
if (!vis[e[i].to]) {
deep[e[i].to] = 1 + front.second;
que.push(make_pair(e[i].to, front.second + 1));
vis[e[i].to] = 1;
}
}
}
};
bfs(q);
for (int i = 1; i <= n; i++) vis[i] = 0;
vis[q] = 1;
dfs(q);
}

signed main() {
init();
int Case = 1;
// cin >> Case;
while (Case--) {
solve();
}
return 0;
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!