不明白为什么当考虑图可能不连通时,采用for循环去重新dfs和bfs未被遍历的点时会出错(第三个样例WA了),题目并未明确指出是一个连通图吧(狗头)?
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int N = 100010;
int n, m;
bool vis[N];
vector< priority_queue<int, vector<int>, greater<int>>> gra_d(N), gra_b(N);
void dfs(int u) {
if (!vis[u]) {
cout << u << ' ';
vis[u] = true;
}
while (!gra_d[u].empty()) {
int t = gra_d[u].top(); gra_d[u].pop();
if(!vis[t])
dfs(t);
}
}
void bfs(int u) {
queue<int > q;
q.push(u);
while (!q.empty()) {
auto x = q.front(); q.pop();
if (!vis[x]) {
printf("%d ", x);
vis[x] = true;
}
while (!gra_b[x].empty()) {
auto t = gra_b[x].top(); gra_b[x].pop();
if(!vis[t])
q.push(t);
}
}
}
int main() {
memset(vis, false, sizeof vis);
cin >> n >> m;
int x, y;
while (m--) {
scanf("%d %d",&x,&y);
gra_b[x].push(y);
gra_d[x].push(y);
}
for(int i=1;i<=n;i++)
if(!vis[i])
dfs(i);
cout << '\n';
memset(vis, false, sizeof vis);
for(int i=1;i<=n;i++)
if(!vis[i])
bfs(i);
}