Problem Description
XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure—超级空中漫游结构)进行交流,每条SARS都对行驶在上面的Flycar限制了固定的Speed,同时XX星人对 Flycar的“舒适度”有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服 ,(理解为SARS的限速要求,flycar必须瞬间提速/降速,痛苦呀 ),
但XX星人对时间却没那么多要求。要你找出一条城市间的最舒适的路径。(SARS是双向的)。
Input
输入包括多个测试实例,每个实例包括:
第一行有2个正整数n (1
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
并查集&贪心
枚举最小边,再从小到大一直加大于等于这个最小边的其他边,直到起点跟终点属于同一个集合为止,然后用最大边-最小边的差,看能不能更新ans
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#define N 202
const int mm = 1000000007;
using namespace std;
struct edge
{
int u, v, s;
friend bool operator < (edge a, edge b)
{
return a.s < b.s;
}
}e[1001];
int n, m, pre[N];
int find(int x)
{
if (x != pre[x])
pre[x] = find(pre[x]);
return pre[x];
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1.txt", "r", stdin);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
int i, j, k, u, v, q, ans, uu, vv;
while(cin >> n >> m)
{
for (i = 0; i < m; i++)
cin >> e[i].u >> e[i].v >> e[i].s;
sort(e, e+m);
cin >> q;
while(q--)
{
cin >> u >> v;
ans = mm;
for (i = 0; i < m; i++)//枚举最小边
{
for (j = 0; j <= n; j++) pre[j] = j;
for (j = i; j < m; j++)//最大边
{
uu = find(e[j].u);
vv = find(e[j].v);
if (uu != vv)
pre[uu] = vv;
if (find(u) == find(v))
{
ans = min(ans, e[j].s-e[i].s);
break;
}
}
if (j == m) break;
}
if (ans == mm) cout << -1 << endl;
else cout << ans << endl;
}
}
return 0;
}