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;
}

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

被折叠的 条评论
为什么被折叠?



