BUAA(2021春)图的直径(士谔书院15级期末)——求有向图的最大路径:Floyd的妙用(已上传题解和测试地址)

48 篇文章 154 订阅

看前须知

要点介绍和简要声明.

考试回顾

格式控制输入输出——期中考试模拟题(简单的分类讨论).

标识符的识别(期中考试题)——题目说的不清不楚但其实不难.

空闲空间申请模拟(期中考试题)——注意读题,难度其实一般.

网络打印机选择(北京学院数据结构18级期末压轴题)——伪树状数组(这题杀我)(ಥ_ಥ).

查家谱(士谔书院16级期末)——找最近公共祖先.

图的直径(士谔书院15级期末)——求有向图的最大路径:Floyd的妙用.

快逃离卷怪统治的BUAA——求树中的最短路径+中序和后序恢复二叉树.

题目内容

测试地点点击此处.

问题描述

暗中观察|.・`) 给你一个带权的有向图,请你求出这个图的直径。

我们定义一个有向图的直径为图中连通的两点之间的最大距离

输入形式

多组输入数据,以EOF结束输入。

每组数据第一行为两个正整数n m(均小于100)。顶点编号1~n。

接下来m行,每行三个正整数u v d,表示有一条从u到v的路,并且路的长度为d(u v 均不大于n,d小于100)。

保证不存在环和重边。图不一定连通。

输出形式

对于每组数据,输出一行,为图的直径。

样例

【输入】

5 4
1 2 1
2 3 1
3 4 1
2 5 10

【输出】

11

样例说明

【样例说明】

最长路径为 1 —> 2 —> 5

题解

思考和详解

看了一下往年的期末考试题,对于的图的考察较少,基本都是最基础的,所以这次也选了一道比较基础的题目,只不过对于思维的考察比较高。

首先我们学过最短路径的算法,就是不断的贪心选边,同时更新最短边数组的信息,然后重复以上操作。我们一定要注意到贪心的意思,贪心就是选择当前最小的。好了,最好玩的事情开始了,请问:最大的数的相反数是不是最小的?答案是很明确的是吧!所以我们只需要把每一个权值都变为它的相反数,然后在找最短路径,最后输出最短路径的相反数不就是答案了吗! 是不是有点巧妙哈哈哈哈。但是我们一定要注意的是,Dijkstra算法只能解决单源最短路而且不能解决负权边,所以不可以使用,因此采用Floyd算法可以很快解决问题。

参考代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define M 200
#define INF 0x3f3f3f3f
int map[M][M];
void floyd(int VerNum)
{
	int i,j,k;
	for(k=1;k<=VerNum;k++)
		for(i=1;i<=VerNum;i++)
			for(j=1;j<=VerNum;j++)
				if(map[i][j]>map[i][k]+map[k][j])	//三角形原则更新路径 
				{
					map[i][j]=map[i][k]+map[k][j];
				}
}
int main()
{	
	int i,j,n,m,u,v,w,ans=0;
	while(~scanf("%d %d",&n,&m))	//录入信息 
	{
		ans=0;
		memset(map,0,sizeof(map));	//注意多组数据时要初始化 
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=n;j++)
			{
				if(i==j)	map[i][j]=0;
				else	map[i][j]=INF;
			}
		}
		for(i=1;i<=m;i++)
		{
			scanf("%d %d %d",&u,&v,&w);
			map[u][v]=-w;		//注意是负权边 
		}
		floyd(n);		//Floyd算法找最短路 
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=n;j++)
			{
				if(map[i][j]<ans)	//筛选出最小的负数 
				ans=map[i][j];
			}
		}
		printf("%d\n",-ans);	//输出相反数 
	}
	return 0;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值