这题我用DFS超时,用并查集可以AC。
#include<iostream>
#include<algorithm>
using namespace std;
int f[210];
int n, m, pos;
class Edge
{
public:
int u, v, val;
friend bool operator<(const Edge& a, const Edge& b)
{
return a.val < b.val;
}
}arr[210*210];
void init()
{
for (int i = 0; i < 210; i++)
{
f[i] = i;
}
}
//int find(int x)
//{
// if (f[x] = x)
// {
// return x;
// }
// return f[x] = find(f[x]); //路径压缩
//}
int find(int x)
{
int i, j = x;
while (f[j] != j)
{
j = f[j];
}
while (x != j)
{
i = f[x];
f[x] = j;
x = i;
}
return j;
}
void Union(int x, int y)
{
int a = find(x);
int b = find(y);
if (a != b)
{
f[a] = b;
}
}
int main()
{
int u, v, speed, q;
while (cin >> n >> m)
{
for (int i = 0; i < m; i++)
{
cin >> arr[i].u >> arr[i].v >> arr[i].val;
}
sort(arr, arr + m);
cin >> q;
for (int i = 0; i < q; i++)
{
cin >> u >> v;
int ans = 10000000;
for (int j = 0; j < m; j++)
{
init();
for (int k = j; k < m; k++)
{
Union(arr[k].u, arr[k].v);
if (find(u) == find(v))
{
ans = min(ans, arr[k].val - arr[j].val);
break;
}
}
}
if (ans == 10000000)
cout << -1 << endl;
else
cout << ans << endl;
}
}
return 0;
}