【JZOJ2743】find the most comfortable road

探讨了在XX星上,通过使用一种名为SARS的高速公路结构,如何找到连接两个城市的最舒适路径。该问题转化为在加权图中寻找最小速度差路径,采用贪心算法与并查集实现。关键在于按边权排序后,逐步尝试合并顶点以形成连通路径。

description

   XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流,每条SARS都对行驶在上面的Flycar限制了固定的Speed,同时XX星人对 Flycar的“舒适度”有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服 ,(理解为SARS的限速要求,flycar必须瞬间提速/降速,痛苦呀 ),

   但XX星人对时间却没那么多要求。要你找出一条城市间的最舒适的路径。(SARS是双向的)。

analysis

  • 考场LCT肛错

  • 其实可以这么想,先把原来的边按边权排序

  • 那么这连续一段的边如果能让两个地方相连,那就统计一次

  • 实际是个贪心,用并查集实现


code

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 105
#define MAXM 5055
#define INF 1000000007
#define ll long long
#define fo(i,a,b) for (ll i=a;i<=b;++i)
#define fd(i,a,b) for (ll i=a;i>=b;--i)

using namespace std;

ll fa[MAXN];
ll n,m,S,T,ans;

struct edge
{
	ll x,y,z;
}a[MAXM];

inline ll read()
{
	ll x=0,f=1;char ch=getchar();
	while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
	while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
	return x*f;
}
inline bool cmp(edge a,edge b)
{
	return a.z<b.z;
}
inline ll getfa(ll x)
{
	return fa[x]==0?x:fa[x]=getfa(fa[x]);
}
inline void merge(ll x,ll y)
{
	ll xx=getfa(x),yy=getfa(y);
	if (xx!=yy)fa[xx]=yy;
}
int main()
{
	//freopen("T2.in","r",stdin);
	while (scanf("%lld%lld",&n,&m)!=EOF)
	{
		fo(i,1,m)a[i].x=read(),a[i].y=read(),a[i].z=read();
		sort(a+1,a+m+1,cmp);
		S=read(),T=read(),ans=INF;
		fo(i,1,m)
		{
			memset(fa,0,sizeof(fa));
			fo(j,i,m)
			{
				merge(a[j].x,a[j].y);
				if (getfa(S)==getfa(T))
				{
					ans=min(ans,a[j].z-a[i].z);
					break;
				}
			}
		}
		printf("%lld\n",ans==INF?-1ll:ans);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值