洛谷P3905 道路重建

题目:https://www.luogu.org/problemnew/show/P3905

分析:

此题是显然的最短路算法,只是看到一起删掉的一堆边感到十分棘手,而且还要求出的是最短添加边的总长度

但如果仔细观察就可以发现,我们其实并不用一个一个的全部枚举,只需要把添加的边做最短路就行了。

我们可以首先把数组初始化为一个较大的数,然后每读入一条边,就把此边的权值记录,但还要把它清零。

为什么呢?

因为我们清零相当于不考虑此边的权值,但又可以经过这条边,有效的能保留下删去的边,来仅仅考虑被删边的最短路。

然后读入删掉的边,这时候我们把那些删去的边赋上原来的权值,进行计算即可。

what?这不就是最短路模板吗?

还有呢?

注意到数据范围,

n 100 n\leq100 n100?

不就是Floyd常见的数据范围吗?

于是floyd都往上套了。。。

于是此题经过转换,就成为了一个可用Floyd,dijkstra,spfa等多种最短路算法解决的板子题了。。。

下面给出Floyd代码:

#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int f[105][105],g[105][105];
int main()
{
	
	int n,m;
	scanf("%d%d",&n,&m);
	memset(f,0x3f3f3f3f,sizeof(f));
	for(int i=1;i<=m;i++)
	{
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		g[x][y]=g[y][x]=z;
		f[x][y]=f[y][x]=0;
	}
	int d;
	scanf("%d",&d);
	for(int i=1;i<=d;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		f[x][y]=f[y][x]=g[x][y];
	}
	for(int k=1;k<=n;k++)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				f[i][j]=fmin(f[i][j],f[i][k]+f[k][j]);
			}
		}
	}
	int x,y;
	scanf("%d%d",&x,&y);
	printf("%d",f[x][y]);
	return 0;
}
全部评论

相关推荐

notbeentak...:就抓,嗯抓,开不开匿名都要抓,一点坏事不让说,就对公司顶礼膜拜佩服的五体投地就对了
点赞 评论 收藏
分享
来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务