下面代码样例能过,第一个测试点能过,剩下的 WA 了。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
struct Edge {
int to, w, next;
} E[N];
struct edge {
int s, e, w;
bool operator < (edge other) const {
return e < other.e;
}
};
int n, m, u, v, w, cnt, head[N];
bool vis[N];
void init() {
cnt = 0;
for (int i = 0; i <= n; ++i) {
head[i] = -1;
}
}
void add(int u, int v, int w) {
E[cnt] = {v, w, head[u]};
head[u] = cnt++;
}
void print_edge() {
for (int i = 1; i <= n; ++i) {
vector<edge> e;
for (int j = head[i]; j != -1; j = E[j].next) {
e.push_back({i, E[j].to, E[j].w});
}
sort(e.begin(), e.end());
for (edge j : e) {
cout << j.s << " -> " << j.e << " cost: " << j.w << endl;
}
}
}
void dfs(int x) {
cout << x << " ";
vis[x] = false;
vector<edge> e;
for (int j = head[x]; j != -1; j = E[j].next) {
e.push_back({x, E[j].to, E[j].w});
}
sort(e.begin(), e.end());
for (edge j : e) {
if (vis[j.e]) {
dfs(j.e);
}
}
}
void bfs(int s) {
memset(vis, true, sizeof(vis));
queue<int> q;
q.push(s);
cout << s << " ";
while (!q.empty()) {
int qf = q.front();
q.pop();
vector<edge> e;
for (int j = head[qf]; j != -1; j = E[j].next) {
e.push_back({qf, E[j].to, E[j].w});
}
sort(e.begin(), e.end());
for (edge j : e) {
if (vis[j.e]) {
vis[j.e] = false;
cout << j.e << " ";
q.push(j.e);
}
}
}
}
int main() {
memset(vis, true, sizeof(vis));
cin >> n >> m;
init();
for (int i = 1; i <= m; ++i) {
// cin >> u >> v >> w;
cin >> u >> v;
add(u, v, 1);
}
dfs(1);
cout << endl;
bfs(1);
cout << endl;
return 0;
}