代码随想录算法训练营第五十八天 | 图论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;
}
相关推荐
你撅嘴真丑6 小时前
第九章-数字三角形
算法
uesowys6 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
ValhallaCoder6 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
董董灿是个攻城狮6 小时前
AI 视觉连载1:像素
算法
智驱力人工智能6 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
孞㐑¥7 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
月挽清风7 小时前
代码随想录第十五天
数据结构·算法·leetcode
XX風7 小时前
8.1 PFH&&FPFH
图像处理·算法
NEXT068 小时前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法
代码游侠8 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法