每日算法:BFS DFS

题目来源:洛谷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排序;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前路漫漫亦灿灿上岸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值