UESTC - 1636 梦后楼台高锁,酒醒帘幕低垂(枚举+最小生成树)

本文介绍了一种解决图中从节点1到节点n路径上边权最大值与最小值之差最小的问题的方法。通过枚举最小边并使用类似Kruskal算法进行连通性检查,找到使路径边权差最小的方案。代码实现简洁,关键在于固定最小值,调整其他边以达到最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

给你一张图,

求1到n的路径,边权最大值-边权最小值最小的差ans

输出这个ans

思路来源

https://blog.csdn.net/ProLightsfxjh/article/details/72791792

题解

挺暴力的

这种题就是固定一个值,让另一个值尽可能接近

那么我们固定最小值,即枚举最小边

kruskal式合并,1-n连通的时候停下, 然后更新这个值

相当于假设当前枚举的这条边在路径里,在包含这条边的路径里取ans最小的那条

所有的路径里再取最小

心得

自己做题量还是不够

还是要好好补之前没有做过的题

明明代码也不难代码量也不多 就是想不出来

这种思维题还是挺重要的啊

好吧UESTC交不上去了但我觉得应该能A

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e3+5;
const int INF=0x3f3f3f3f;
int n,m,par[maxn],ans;
struct edge
{
   int from,to,w;	
}e[maxn];
bool operator<(edge a,edge b)
{
   	return a.w<b.w;
}
int find(int x)
{
	return par[x]==x?x:par[x]=find(par[x]);
}
void unite(int x,int y)
{
	x=find(x),y=find(y);
	if(x==y)return;
	if(x<y)par[y]=x;
	else par[x]=y;
}

int main()
{
	while(~scanf("%d%d",&n,&m))
	{
	ans=INF;
	for(int i=0;i<m;++i)
	{
		scanf("%d%d%d",&e[i].from,&e[i].to,&e[i].w);
	}
	sort(e,e+m);
	for(int i=0;i<m;++i)
	{
		int tmp=INF;
		for(int j=1;j<=n;++j)par[j]=j;
		for(int j=i;j<m;++j)
		{
			int u=e[j].from,v=e[j].to;
			if(find(u)==find(v))continue;
			else unite(u,v);
			if(find(1)==find(n))
			{
			 tmp=e[j].w-e[i].w;	
			 break;
		    }
		}
		ans=min(ans,tmp);
	}
	printf("%d\n",ans);
    }
	return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值