P1695-极品飞车

题目

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

输入格式 Input Format
第一行有2个正整数n (1<n<201)和m (m<1001),表示有N个城市和M条SARS。
第二行是三个正整数StartCity,EndCity,speed,表示从表面上看StartCity到EndCity,限速为speed的SARS。然后是一个正整数Q(Q<11),表示寻路的个数。
接下来Q行每行有2个正整数Start,End, 表示寻路的起终点。

输出格式 Output Format
每个寻路要求打印一行,仅输出一个非负整数表示最佳路线的舒适度最高速与最低速的差。
如果无解,输出32475…(不要问为什么…我就是被这么坑的)

缩减过后的题面:找到一条路径满足两个要求:①起点可以到达终点;②使得这条路径上的 最 大 的 边 权 − 最 小 的 边 权 最大的边权-最小的边权 求得的值最小

思路

  1. 对于上面①中的要求,因为题目中所给的路径是双向边,所以说只要找到一条路径中
    有起点和终点就可以了
    等价于
    在并查集的操作中 g e t f a t h e r ( 起 点 ) = = g e t f a t h e r ( 终 点 ) getfather(起点)==getfather(终点) getfather==getfather【判断标志】
  2. 针对于要求②,那么也就很简单了,求一个生成森林(生成树)的最大权值减去最小权值所得结果的最小值, [小数据版] 边权差值最小的生成树,这道题也是数据不大的, 顺便推荐一波之前写的博客

代码

//2019.4.12
//melody 
#include<bits/stdc++.h>
using namespace std;
int n,m,q;
int s,t;
int fa[300];
bool flag;
int minn,maxx,ans;

inline int read()
{
	int x=0,f=1; char ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
	return x*f;
}

struct edge
{
	int x,y,z;
}e[1010];

inline bool mycmp(edge x,edge y)
{
	return x.z<y.z;
}

inline int gf(int x)
{
	if(fa[x]==x)	return x;
	return fa[x]=gf(fa[x]);
}

int main()
{
	n=read(); m=read();
	for(int i=1;i<=m;++i)
	{
		e[i].x=read();
		e[i].y=read();
		e[i].z=read();
	}
	sort(e+1,e+1+m,mycmp);
	q=read();
	for(int w=1;w<=q;++w)
	{
		s=read(); t=read();
		ans=1000000;
		for(int i=1;i<=m;++i)//枚举每一条边
		{
			minn=e[i].z;
			flag=false; flag1=false; flag2=false;
			for(int k=1;k<=n;++k)	fa[k]=k;
			for(int j=i;j<=m;++j)
			{
				int xx=gf(e[j].x);
				int yy=gf(e[j].y);
				if(xx==yy)	continue;
				fa[xx]=yy;
				if(gf(s)==gf(t))//①中的判断标志
				{
					flag=true;
					maxx=e[j].z;
					break;
				}
			}
			if(flag==true)	ans=min(ans,maxx-minn);
		}
		if(ans==1000000)	cout<<32475<<endl;
		else				cout<<ans<<endl;
	}
	return 0;
}

啊啊啊啊啊啊啊啊,这道题卡了我很长时间的啊,第一次提交还是只有10分……(〃>皿<)
好吧,还是自己菜( ̄ー ̄)。。。

粘一个小句子:
"无论你考了多少分 能不能去你想去的学校 都不用担心 你能去的地方 会带给你你预想不到的惊喜 你会遇见一些人 觉得相见恨晚 或者遇到一个人觉得在哪里值得 这是命 遇见你该遇见的 接受你所不能改变的 中考高考的迷人之处 不是如愿以偿 而是阴差阳错 "
——网易云音乐《青春不打烊》热评

如果不能改变环境,那就改变自己吧!

完……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值