求助一个问题
查看原帖
求助一个问题
392679
petrioch楼主2022/2/21 22:43

不明白为什么当考虑图可能不连通时,采用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);
}
2022/2/21 22:43
加载中...