代码随想录算法训练营第五十八天 | 图论part08

117. 软件构建

在这一题中,只需要输出一种方法。使用BFS的方法,找到入度为0的节点,将其从树中删去,重复上述步骤,直到没有入度为0的节点。如果此时没有删除所有的节点,表明这个有向图有环,输出-1.否则,正常输出。

cpp 复制代码
#include <iostream>
#include <vector>
#include <unordered_map>
#include <queue>
#include <fstream>

using namespace std;



int main() {
	int n, m;
	int s, t;
	ifstream infile("input.txt");
	cin >> n >> m;
	unordered_map<int, vector<int>> table;
	vector<int> inDegrees(n, 0);
	while (m--) {
		cin >> s >> t;
		inDegrees[t]++;
		table[s].emplace_back(t);
	}

	queue<int> que;
	for (int i = 0; i < n; ++i) {
		if (inDegrees[i] == 0)
			que.push(i);
	}
	vector<int> result;
	while (!que.empty()) {
		int cur = que.front();
		que.pop();
		result.push_back(cur);

		for (int t : table[cur]) {
			inDegrees[t]--;
			if (inDegrees[t] == 0)
				que.push(t);
		}
	}
	if (result.size() != n) cout << -1;
	else {
		for (int i = 0; i < n - 1; ++i) 
		    cout << result[i] << " ";
        cout << result[n - 1];
	}
	
	return 0;
}

47. 参加科学大会

思路是三部:

  1. 找到距离源点最近的节点
  2. 将节点标记为已访问
  3. 更新非访问节点的minDist

本算法所需要的数据结构:

存放图的临接矩阵

记录访问的一维数组

记录到源点的距离的一维数组

cpp 复制代码
#include <iostream>
#include <vector>
#include <unordered_map>
#include <queue>
#include <fstream>
#include <climits>
using namespace std;



int main() {
	int n, m;
	int s, e, v;
	ifstream infile("input.txt");
	cin >> n >> m;
	vector<vector<int>> graph(n + 1, vector<int>(n + 1, INT_MAX));
	
	while (m--) {
		cin >> s >> e >> v;
		graph[s][e] = v;
	}
	// 记录访问的一维数组
	vector<bool> visited(n + 1, false);
	// 记录到源点的距离的一维数组  
	vector<int> minDist(n + 1, INT_MAX);

	minDist[1] = 0;

	for (int i = 1; i <= n; ++i) {
		// 找到距离源点最近的节点
		int cur = 1;
		int minVal = INT_MAX;
		for (int v = 1; v <= n; ++v) {
			if (!visited[v] && minDist[v] < minVal) {
				cur = v;
				minVal = minDist[v];
			}
		}

		// 将节点标记为已访问
		visited[cur] = true;

		// 更新非访问节点的minDist
		for (int e = 1; e <= n; ++e) {
			if (!visited[e] && graph[cur][e] != INT_MAX && graph[cur][e] + minVal < minDist[e])
				minDist[e] = graph[cur][e] + minVal;
		}
		
	}
	if (minDist[n] == INT_MAX) cout << -1 << endl;
    else cout << minDist[n] << endl;
	return 0;
}
相关推荐
pianmian13 小时前
python数据结构基础(7)
数据结构·算法
好奇龙猫5 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
sp_fyf_20245 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘
香菜大丸6 小时前
链表的归并排序
数据结构·算法·链表
jrrz08286 小时前
LeetCode 热题100(七)【链表】(1)
数据结构·c++·算法·leetcode·链表
oliveira-time6 小时前
golang学习2
算法
南宫生7 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
懒惰才能让科技进步7 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
Ni-Guvara8 小时前
函数对象笔记
c++·算法
泉崎8 小时前
11.7比赛总结
数据结构·算法