题目来源:洛谷P5318
日期:2023.10.10
第二天
题目:
题解:
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int n, m;
vector<int> Adj[N];
bool inq[N] = {0};
void BFS(int u) {
queue<int> q;
q.push(u);
inq[u] = 1;
printf("1 ");
while(!q.empty()) {
//取头节点,在这个点所有相邻的点中,找到未加入过队列的点
int head = q.front();
q.pop();
for(int i = 0; i < Adj[head].size(); i++) {
if(inq[Adj[head][i]] == 0) {
q.push(Adj[head][i]);
inq[Adj[head][i]] = 1;
printf("%d ",Adj[head][i]);
}
}
}
}
void DFS(int u) {
printf("%d ", u);
inq[u] = 1;
for(int i = 0; i < Adj[u].size(); i++) {
if(inq[Adj[u][i]] == 0) {
DFS(Adj[u][i]);
}
}
}
int main(void) {
scanf("%d%d", &n, &m);
//建图
for(int i = 0; i < m; i++) {
int id1, id2;
scanf("%d%d", &id1, &id2);
//id1到id2有一条边
Adj[id1].push_back(id2);
}
//给邻接表的元素升序排列
for(int i = 1; i <= n; i++) {
sort(Adj[i].begin(), Adj[i].end(), less<int>());
}
DFS(1);
cout << endl;
memset(inq, 0, sizeof(inq));
BFS(1);
return 0;
}
出现的问题:
1.DFS()时,加入相邻点,没有判断该点是否加入过队列;
2.没有给邻接链表的从小到达排序,没有按照题目要求按顺序输出;
3.sort()给vector排序;