当前位置: 首页 > article >正文

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

117. 软件构建

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

#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

本算法所需要的数据结构:
存放图的临接矩阵
记录访问的一维数组
记录到源点的距离的一维数组

#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;
}

http://www.kler.cn/news/283715.html

相关文章:

  • 验证码获取测试的步骤和要点
  • nipplejs(虚拟游戏操作杆)跟fabric(canvas缩放、旋转)
  • 解决linux每次打开新终端都要重新source ~/.bashrc问题
  • word文档转html(只支持段落和表格)
  • git 拉取或推送到指定分支
  • IPython 使用技巧整理
  • nginx启动报错:worker_connections exceed open file resource limit: 1024
  • ES6基础----Map的使用
  • 【问题分析】CtsWindowManagerDeviceAnimations【Android15】
  • SpringBoot中@SchedulerLock注解实现定时任务中分布式锁的使用
  • CTFhub通关攻略-SSRF篇【1-5关】
  • windows安装Docker的步骤
  • 内联函数与动态内存分配
  • URP custompasscustom render objects
  • c++多线程交替输出
  • 启动盘如何复原
  • 【一文详解】内外网文件摆渡系统,解决网间数据安全传输问题
  • 【Python进阶(十二)】——自然语言处理
  • 《华为云 AI:开启智能未来的钥匙》
  • zsh 的补全系统
  • 数字芯片设计验证经验分享(第三部分):将ASIC IP核移植到FPGA上——如何确保性能与时序以完成充满挑战的任务!
  • 【FRP 内网穿透】
  • 【问题分析】SetupWizard退出动画卡住【Android15】
  • 【零知识证明】Groth16
  • GAMES202——作业3 Screen Space Ray Tracing
  • 创建型设计模式-构建器(builder)模式-python实现
  • 35. 交错动画 导航列表项的悬停和聚焦效果
  • Linux下UDP编程
  • InternVL 多模态模型部署微调实践
  • 物联网平台组件2: 平台校验规则