题意
给你一张图,
求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;
}