您的位置:首页 > 其它

find the most comfortable road(并查集,最短路)

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

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

[align=left]Input[/align]
输入包括多个测试实例,每个实例包括:

第一行有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, 表示寻路的起终点。

[align=left]Output[/align]
每个寻路要求打印一行,仅输出一个非负整数表示最佳路线的舒适度最高速与最低速的差。如果起点和终点不能到达,那么输出-1。

[align=left]Sample Input[/align]

4 4
1 2 2
2 3 4
1 4 1
3 4 2
2
1 3
1 2


[align=left]Sample Output[/align]

1
0


思路:
主要运用了并查集,和贪心,先把所有公路的速度,由小到大排序,然后一条一条的取,最后所有公路差的最大值就是结果。

代码:

代码:

#include <cstdio>

#include <iostream>

#include <algorithm>

using namespace std;

const int maxn = 205;

const int maxm = 1005;

const int inf = (0x7f7f7f7f);

#define min(a,b) ((a)<(b)?(a):(b))

int n, m, s, t;

int ans;

int fa[maxn];

struct Edge

{

int s, e, speed;

}edge[maxm];

int cmp(Edge a, Edge b) //速度排序。

{

return a.speed < b.speed;

}

int find(int x)

{

while (fa[x] != x) x = fa[x];

return x;

}

int main()

{

while (scanf("%d %d", &n, &m) != EOF)

{

int i, j;

for (i=0; i<m; i++)

{

scanf("%d %d %d", &edge[i].s, &edge[i].e, &edge[i].speed);

}

sort(edge, edge+m, cmp);

int q;

scanf("%d", &q);

while (q--)

{

scanf("%d %d", &s, &t);

int min = inf;

for (i=0; i<m; i++) //枚举

{

for (j=1; j<=n; j++) fa[j] = j;

for (j=i; j<m; j++)

{

int fx = find(edge[j].s);

int fy = find(edge[j].e);

if (fx != fy) fa[fx] = fy;

if (find(s) == find(t))

{

min = min(min, edge[j].speed - edge[i].speed);

break;

}

}

}

if (min == inf) puts("-1");

else printf("%d\n", min);

}

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  并查集入门