XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流,每条SARS都对行驶在上面的Flycar限制了固定的Speed,同时XX星人对 Flycar的“舒适度”有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服 ,(理解为SARS的限速要求,flycar必须瞬间提速/降速,痛苦呀 ),
但XX星人对时间却没那么多要求。要你找出一条城市间的最舒适的路径。(SARS是双向的)。
Input
输入包括多个测试实例,每个实例包括:
第一行有2个正整数n (1<n<=200)和m (m<=1000),表示有N个城市和M条SARS。
接下来的行是三个正整数StartCity,EndCity,speed,表示从表面上看StartCity到EndCity,限速为speedSARS。speed<=1000000
然后是一个正整数Q(Q<11),表示寻路的个数。
接下来Q行每行有2个正整数Start,End, 表示寻路的起终点。
Output
每个寻路要求打印一行,仅输出一个非负整数表示最佳路线的舒适度最高速与最低速的差。如果起点和终点不能到达,那么输出-1。
Sample Input
4 4
1 2 2
2 3 4
1 4 1
3 4 2
2
1 3
1 2
Sample Output
1
0
这道题给出了m条路,找出寻路a(起) 到 b(终) 最佳路线的舒适度最高速与最低速的差。需要运用并查集,枚举法和贪心相结合
先将输入的限速数据存入结构体里再进行从小到大进行排序,然后在进行枚举查找最小的值,每次找的时候并查集记得初始化。当然找的时候应该从j = i点开始,不然就少了一组数据
但XX星人对时间却没那么多要求。要你找出一条城市间的最舒适的路径。(SARS是双向的)。
Input
输入包括多个测试实例,每个实例包括:
第一行有2个正整数n (1<n<=200)和m (m<=1000),表示有N个城市和M条SARS。
接下来的行是三个正整数StartCity,EndCity,speed,表示从表面上看StartCity到EndCity,限速为speedSARS。speed<=1000000
然后是一个正整数Q(Q<11),表示寻路的个数。
接下来Q行每行有2个正整数Start,End, 表示寻路的起终点。
Output
每个寻路要求打印一行,仅输出一个非负整数表示最佳路线的舒适度最高速与最低速的差。如果起点和终点不能到达,那么输出-1。
Sample Input
4 4
1 2 2
2 3 4
1 4 1
3 4 2
2
1 3
1 2
Sample Output
1
0
这道题给出了m条路,找出寻路a(起) 到 b(终) 最佳路线的舒适度最高速与最低速的差。需要运用并查集,枚举法和贪心相结合
先将输入的限速数据存入结构体里再进行从小到大进行排序,然后在进行枚举查找最小的值,每次找的时候并查集记得初始化。当然找的时候应该从j = i点开始,不然就少了一组数据
#include<stdio.h>
#include<algorithm> //对结构体进行排序的头文件
using namespace std;
#define inf 0x3f3f3f3f
int m,n,f[2010];
struct note
{
int u,v,w;
} e[10010]; //注意数组的大小,不要和n范围给弄混了
int cmp(note a,note b) //结构体进行从小到大排序
{
return a.w < b.w;
}
void init() //并查集初始化
{
for(int i = 1; i <= n; i++)
f[i] = i;
}
int getf(int v) //并查集找祖先的递归函数
{
if(f[v] == v)
return v;
else
{
//路径压缩,在每次返回函数的时候,把它的值改为其祖先
f[v] = getf(f[v]);
return f[v];
}
}
void merge(int v,int u) //并查集 合并两 子集合的函数
{
int t1,t2;
t1 = getf(v);
t2 = getf(u);
if(t1 != t2) //判断这两个点是否在同一个集合中
f[t2] = t1;
}
int main()
{
while(~scanf("%d%d",&n,&m)) //n表示的是村庄的数目, m表示的是道路数
{
for(int i = 0; i < m; i++)
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
sort(e,e+m,cmp); //两个村庄的距离进行从近到远排序
//并查集初始化
int t,p,q,minn;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&p,&q);
minn = inf;
for(int i = 0; i < m; i++) //枚举法,找出所有情路况最优解
{
init();
for(int j = i; j < m; j++) //从j点开始,找出能连通p、q的路
{
merge(e[j].u,e[j].v);
if(getf(p) == getf(q))
{
minn = min(minn,(e[j].w - e[i].w));
break;
}
}
}
if(minn == inf)
printf("-1\n");
else
printf("%d\n",minn);
}
}
return 0;
}