Floyd-Warshall最短路径(C++,例题:pta大众情人)

news2024/11/15 15:38:24

   Floyd-Warshall算法是一种用于求解所有点对之间最短路径的动态规划算法。它可以处理带权有向图或无向图,但是不能处理带负环的图。

算法步骤如下:

1. 初始化一个n×n的矩阵D,其中D[i][j]表示从顶点i到顶点j的最短路径长度,如果i和j之间没有边,则D[i][j]为无穷大。

2. 对于每对顶点i和j,如果存在一条从i到j的边,则D[i][j]的初始值为这条边的权值。

3. 对于每个顶点k,依次考虑所有的有序对(i,j),其中i,j∈{1,2,...,n},如果从顶点i到顶点j经过顶点k的路径比直接从i到j路径更短,则更新D[i][j]的值为D[i][k]+D[k][j]。

4. 最终得到的矩阵D即为所有点对之间的最短路径长度。

Floyd-Warshall算法的时间复杂度为O(n^3),空间复杂度为O(n^2)。

#include<iostream>
using namespace std;
int main()
{
	int a[10][10], n, m,inf=99999;
	cin >> n >> m;//读入节点,边
	for (int i = 1; i <= n; i++)//初始化
	{
		for (int j = 1; j <= n; j++)
		{
			if (i == j)
				a[i][j] = 0;
			else
				a[i][j] = inf;
		}
	}
	for (int i = 1; i <= m; i++)
	{
		int t1, t2, t3;
		cin >> t1 >> t2 >> t3;
		a[t1][t2] = t3;
	}
	for(int k=1;k<=n;k++)//核心
		for(int i=1;i<=n;i++)
			for (int j = 1; j <= n; j++)
			{
				if (a[i][j] > a[i][k] + a[k][j])
					a[i][j] = a[i][k] + a[k][j];
			}
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
			cout << a[i][j]<<" ";
		cout << endl;
	}
}

  人与人之间总有一点距离感。我们假定两个人之间的亲密程度跟他们之间的距离感成反比,并且距离感是单向的。例如小蓝对小红患了单相思,从小蓝的眼中看去,他和小红之间的距离为 1,只差一层窗户纸;但在小红的眼里,她和小蓝之间的距离为 108000,差了十万八千里…… 另外,我们进一步假定,距离感在认识的人之间是可传递的。例如小绿觉得自己跟小蓝之间的距离为 2,则即使小绿并不直接认识小红,我们也默认小绿早晚会认识小红,并且因为跟小蓝很亲近的关系,小绿会觉得自己跟小红之间的距离为 1+2=3。当然这带来一个问题,如果小绿本来也认识小红,或者他通过其他人也能认识小红,但通过不同渠道推导出来的距离感不一样,该怎么算呢?我们在这里做个简单定义,就将小绿对小红的距离感定义为所有推导出来的距离感的最小值。

一个人的异性缘不是由最喜欢他/她的那个异性决定的,而是由对他/她最无感的那个异性决定的。我们记一个人 i 在一个异性 j 眼中的距离感为 Dij​;将 i 的“异性缘”定义为 1/maxj∈S(i)​{Dij​},其中 S(i) 是相对于 i 的所有异性的集合。那么“大众情人”就是异性缘最好(值最大)的那个人。

本题就请你从给定的一批人与人之间的距离感中分别找出两个性别中的“大众情人”。

输入格式:

输入在第一行中给出一个正整数 N(≤500),为总人数。于是我们默认所有人从 1 到 N 编号。

随后 N 行,第 i 行描述了编号为 i 的人与其他人的关系,格式为:

性别 K 朋友1:距离1 朋友2:距离2 …… 朋友K:距离K

其中 性别 是这个人的性别,F 表示女性,M 表示男性;K(<N 的非负整数)为这个人直接认识的朋友数;随后给出的是这 K 个朋友的编号、以及这个人对该朋友的距离感。距离感是不超过 106 的正整数。

题目保证给出的关系中一定两种性别的人都有,不会出现重复给出的关系,并且每个人的朋友中都不包含自己。

输出格式:

第一行给出自身为女性的“大众情人”的编号,第二行给出自身为男性的“大众情人”的编号。如果存在并列,则按编号递增的顺序输出所有。数字间以一个空格分隔,行首尾不得有多余空格。

输入样例:

6
F 1 4:1
F 2 1:3 4:10
F 2 4:2 2:2
M 2 5:1 3:2
M 2 2:2 6:2
M 2 3:1 2:5

输出样例:

2 3
4

注意:

1、该题相当于有向图。

2、求异性缘的时候是别人对自己的距离感,不是自己对别人的,所以在矩阵中看的是列。

3、求大众情人就是在男生、女生中分别先求出每个人的异性缘,才从中选出最小的异性缘。

#include<iostream>
using namespace std;
int main()
{
	int ju[510][510],def=1e9,d[510];
	char a[510];
	int m;
	cin >> m;
	for(int i=1;i<=m;i++)//初始化
		for (int j = 1; j <= m; j++)
		{
			if (i == j)
				ju[i][j] = 0;
			else
				ju[i][j] = def;
		}
	for (int i = 1; i <= m; i++)//储存边
	{
		cin >> a[i];
		int t;
		cin >> t;
		for (int j = 1; j <= t; j++)
		{
			int t1, t2;
			char c;
			cin >> t1 >> c >> t2;
			ju[i][t1]=t2;
		}
	}
	for(int k=1;k<=m;k++)//floyd
		for(int i=1;i<=m;i++)
			for (int j = 1; j <= m; j++)
			{
				if (ju[i][j] > ju[i][k] + ju[k][j])
					ju[i][j] = ju[i][k] + ju[k][j];
			}
	//for (int i = 1; i <= m; i++)
	//{
		//for (int j = 1; j <= m; j++)
			//cout << ju[i][j];
		//cout << endl;
	//}
	for(int i=1;i<=m;i++)//每个人的最大异性缘
		for (int j = 1; j <= m; j++)
		{
			if (a[i] != a[j])
				d[i] = max(d[i], ju[j][i]);
		}
	int d1=def, d2=def;
	for (int i = 1; i <= m; i++)//求男生,女生里面最小的最大值
	{
		if (a[i] == 'F')
			d1 = min(d[i], d1);
		else
			d2 = min(d[i], d2);
 	}
	int ma[510], w[510];
	int k1 = 0, k2 = 0;
	for (int i = 1; i <= m; i++)//分别看男生中、女生中有几个最小的最大值,将编号记录
	{
		if (a[i] == 'F' && d[i] == d1)
			w[k1++] = i;
		if (a[i] == 'M' && d[i] == d2)
			ma[k2++] = i;	
	}
	int i;
	for ( i = 0; i < k1-1; i++)//输出女生
		cout << w[i]<<" ";
	cout << w[i];
    cout<<endl;
	for ( i = 0; i < k2-1; i++)//输出男生
		cout << ma[i]<<" ";
	cout << ma[i];
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1085014.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文心一言 VS 讯飞星火 VS chatgpt (111)-- 算法导论10.2 2题

二、用go语言&#xff0c;用一个单链表 L实现一个栈。要求操作 PUSH和 POP 的运行时间仍为 O(1)。 文心一言&#xff1a; 在 Go 语言中&#xff0c;我们可以用结构体来实现一个单链表&#xff0c;然后再用栈的相关操作。 以下是一个可能的实现方式&#xff1a; package mai…

Spring Boot 中的 Redis 数据操作配置和使用

Spring Boot 中的 Redis 数据操作配置和使用 Redis&#xff08;Remote Dictionary Server&#xff09;是一种高性能的开源内存数据库&#xff0c;用于缓存、消息队列、会话管理和数据存储。在Spring Boot应用程序中&#xff0c;Redis被广泛用于各种用例&#xff0c;包括缓存、…

从0开始学Java:Java概述

文章目录 1. JavaSE体系介绍2. 计算机语言介绍3. Java语言概述3.1 Java生态圈3.2 Java语言发展历史3.3 Java技术体系平台3.4 Java的主要应用领域3.5 Java语言的特点 4. Java语言跨平台原理 1. JavaSE体系介绍 JavaSE知识模块介绍 第一部分&#xff1a;计算机编程语言核心结构&…

2023 年诺贝尔物理学奖-阿秒光谱学

如果您想了解和衡量周围的世界&#xff0c;您可以使用的最重要的工具之一就是能够准确地对正在发生的事情进行成像&#xff08;或拍摄快照&#xff09;。在 19 世纪&#xff0c;摄影意味着让拍摄对象保持完全静止&#xff0c;同时积累大量光线&#xff1a;相当于几秒钟的时间。…

一种用于肽图分析的烷化剂,Desthiobiotin-Iodoacetamide

中文名&#xff1a;脱硫生物素-碘乙酰胺 英文名&#xff1a;Desthiobiotin-Iodoacetamide 化学式&#xff1a;C14H25IN4O3 分子量&#xff1a;424.28 外观&#xff1a;固体/粉末 规格&#xff1a;10mg、25mg、50mg等&#xff08;接受各种规格的定制服务&#xff0c;具体可…

JavaScript的懒加载处理

&#x1f618;博主&#xff1a;小猫娃来啦 &#x1f618;文章核心&#xff1a;JavaScript的懒加载处理 文章目录 什么是懒加载实现懒加载的方式js四步法设置占位图监听滚动事件加载图片触发加载函数 什么是懒加载 懒加载&#xff08;Lazy Loading&#xff09;是一种优化技术&a…

GitLab 502问题解决方案

由于最近 gitlab 切换到另一台服务器上部署的 gitlab 后&#xff0c;经常出现 502。平时重启 gitlab 后都能解决&#xff0c;今天突然重启多次后都还是 502&#xff08;重启日志是正常的&#xff09;&#xff0c;遂通过 gitlab-ctl tail 查看日志进行排查。 gitlab-ctl tail通…

《进化优化》第3章 遗传算法

文章目录 3.1 遗传学的历史3.2 遗传学3.3 遗传学的历史3.4 一个简单的二进制遗传算法3.4.1 用于机器人设计的遗传算法3.4.2 选择与交叉3.4.3 变异3.4.5 遗传算法参数调试 3.5 简单的连续遗传算法 遗传算法模仿自然选择来解决优化问题。 为研究遗传算法&#xff0c;得遵守自然选…

微软10月补丁 | 修复103个漏洞,包括2个零日漏洞,13个严重漏洞

近日&#xff0c;微软发布了2023年10月的补丁更新&#xff0c;解决了其软件中的103个漏洞。 在这103个漏洞中&#xff0c;有13个的评级为严重漏洞&#xff0c;90个被评为重要漏洞。自9月12日以来&#xff0c;谷歌已经解决了基于chrome的Edge浏览器的18个安全漏洞。 这两个零日…

ATFX汇市:美国9月CPI数据来袭,机构预期年率增速将继续回落

ATFX汇市&#xff1a;今日20:30&#xff0c;美国劳工部将公布9月未季调CPI年率增速&#xff0c;前值为3.7%&#xff0c;预期值3.6%&#xff1b;9月未季调核心CPI年率&#xff0c;同一时间公布&#xff0c;前值为4.3%&#xff0c;预期值4.1%。无论是名义CPI增速还是核心CPI增速&…

深入理解强化学习——标准强化学习和深度强化学习

分类目录&#xff1a;《深入理解强化学习》总目录 强化学习的历史 早期的强化学习&#xff0c;我们称其为标准强化学习。最近业界把强化学习与深度学习结合起来&#xff0c;就形成了深度强化学习&#xff08;Deep ReinforcemetLearning&#xff09;。因此&#xff0c;深度强化…

基于YOLO算法的单目相机2D测量(工件尺寸和物体尺寸)三

1.简介 1.1 2D测量技术 基于单目相机的2D测量技术在许多领域中具有重要的背景和意义。 工业制造&#xff1a;在工业制造过程中&#xff0c;精确测量是确保产品质量和一致性的关键。基于单目相机的2D测量技术可以用于检测和测量零件尺寸、位置、形状等参数&#xff0c;进而实…

腾讯云国际站-阿里云OSS如何迁移到腾讯云COS?腾讯云cos迁移教程

下面小编将介绍当源对象存储部署在阿里云国际版OSS 时&#xff0c;如何配置全托管迁移任务和半托管迁移任务&#xff0c;实现顺利迁移数据至腾讯云国际版COS。 准备工作 阿里云对象存储 OSS 创建 RAM 子账号并授予相关权限&#xff1a; 登录 RAM 控制台。选择人员管理 > …

吃瓜神奇!企查查、天眼查、天眼销,到底哪家强?

最近&#xff0c;我发现很多人在讨论查企业信息的工具&#xff0c;什么企查查、天眼查、天眼销等&#xff0c;到底哪家强呢&#xff1f; 首先&#xff0c;我们来简单了解一下这些工具。企查查是一款可以帮助用户查询企业信息的工具&#xff0c;通过输入关键词&#xff0c;可以搜…

VPN基础

1.VPN简介 VPN即虚拟专用网&#xff0c;泛指通过VPN技术在公用网络上构建的虚拟专用网络。VPN用户在此虚拟网络中传输私网流量&#xff0c;在不改变网络现状的情况下实现安全、可靠的连接。 专用&#xff1a;VPN网络是专门供VPN用户使用的网络&#xff0c;对于VPN用户&#xf…

Redis魔法:点燃分布式锁的奇妙实现

分布式锁是一种用于在分布式系统中控制对共享资源的访问的锁。它与传统的单机锁不同&#xff0c;因为它需要在多个节点之间协调以确保互斥访问。 本文将介绍什么是分布式锁&#xff0c;以及使用Redis实现分布式锁的几种方案。 一、前言 了解分布式锁之前&#xff0c;需要先了…

太顶了!文心大模型落地文旅行业不仅能业生成潮玩、还可补文物残卷!

10月11日&#xff0c;文化和旅游部公布了2023年文化和旅游数字化创新示范十佳案例和优秀案例。百度文心大模型创新文化产品生产方式入选十佳案例&#xff0c;也是唯一一个入选的大模型应用案例。文心大模型获奖类型为运用数字化工具助力艺术创作生产&#xff0c;促进文化机构数…

产品升级!全球尺度下原核基因组关键基因共进化无标题

微生物是群落型的生存方式&#xff0c;高通量测序时代到来后&#xff0c;掀起了针对微生物群落整体研究的高潮&#xff0c;比如基于功能基因/16S/ITS/扩增子、宏基因组等进行群落多样性分析。但是&#xff0c;我们基于分离培养等方法获得单菌落&#xff0c;针对单菌开展基因组、…

xxx.ko 驱动模块加载报错 “unknown symbol in module or invalid parameter”

一、问题 在对单独驱动模块进行测试时&#xff0c;我们要进行动态编译&#xff0c;生成对应驱动的.ko模块。然后进行手动加载和卸载。但是在进行驱动模块加载时遇到了unknown symbol in module or invalid parameter问题&#xff0c;对此进行排查解决。 二、解决 首先进行dmes…

IEJoin: 提高 Databend range join 性能

作者&#xff1a;王旭东 Databend 研发工程师 xudong963 (xudong.w) GitHub IEJoin 算法可以高效的处理时序场景中的 Range(ASOF) Join。 Join conditions Equi condition 在 下面 SQL 中 SELECT * FROM employee JOIN department ON employee.DepartmentID department.D…