自认为无懈可击(标记了1号节点,排了序,讨论区BUG看了个遍也没找到bug)
查看原帖
自认为无懈可击(标记了1号节点,排了序,讨论区BUG看了个遍也没找到bug)
601006
CSUST_GXL楼主2022/4/15 15:46
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#include<map>
#define pii pair<int,int>
#define debug printf("++ ++");
#define fi first
#define second se
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 1e5;
int n, m, num;
int vis[N + 5];
vector<int>G[N + 5];
void dfs(int now) {
	vis[now] = 1;//标记now号节点(起始now==1)
	if (now != 1) printf(" ");
	printf("%d", now);
	sort(G[now].begin(), G[now].end());//对当前节点指向边排序
	for (auto to : G[now]) {
		if (vis[to]) continue;
		dfs(to);
	}
}
void bfs(int root) {
	memset(vis, 0, sizeof vis);
	priority_queue<pii, vector<pii>, greater<pii>>pq;//必须重载比较函数(重载优先队列,按照优先按照pii第一个数据从小到大排序,再按照pii.second从小到大排)
	pq.push({0, root});
	vis[root] = 1;
	while (!pq.empty()) {
		auto [dis, from] = pq.top();//取出队首素
		pq.pop();
		if (from != 1) printf(" ");
		printf("%d", from);
		for (auto to : G[from]) {
			if (vis[to]) continue;
			vis[to] = 1;
			pq.push({dis + 1, to});放入队列
		}
	}
}
int main() {
	int u, v;
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= m; i++) {
		scanf("%d%d", &u, &v);//单向存图
		G[u].push_back(v);
	}
	dfs(1);
	printf("\n");
	bfs(1);
	return 0;
}

//呜呜呜

2022/4/15 15:46
加载中...