链接请戳--> HDU 1598
题意:如中文所述,不多说了
思路:
1.涉及求MST ,用kruskal;
2.结果要求得最高速度与最低速度的最小差值,记为res.
3.按speed值由小到大先排序,然后逐边枚举,发现寻路的起点与终点连通时,记下此时的res,枚举过程结束时
res要么没被更新过(仍==INF),说明起点与终点间没路径,输出“-1”;要么就是所求;
4.注意i、j 什么的不要写返(= =。。为此查了一个多小时才发现);
以下代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<string>
#define INF 1000000
using namespace std;
struct edges
{
int u,v,c;
}edge[1100];
int n,m;
int f[250];
void set()
{
for( int i = 1; i <= n; ++i )
f[i] = i;
}
bool cmp ( edges a, edges b )
{
return a.c < b.c;
}
int find( int x )
{
if( f[x]==x ) return x;
return f[x] = find(f[x]);
}
int main()
{
int s,t,T,res,dis;
while( scanf("%d%d",&n,&m) != EOF )
{
memset(edge,0,sizeof(edge));
for( int i = 0; i < m; ++i )
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].c);
sort( edge,edge+m,cmp );
scanf("%d",&T);
while( T-- )
{
res = INF;
scanf("%d%d",&s,&t);
for( int i = 0; i < m; ++i )
{
set();
for( int j = i; j < m; ++j )
{
int r1 = find( edge[j].u );
int r2 = find( edge[j].v );
if( r1 != r2 )
f[r2] = r1;
//cout<<"A "<<f[r1]<<" A "<<f[r2]<<endl;
if( find(s)==find(t) )
{
dis = edge[j].c - edge[i].c;
res = min(res,dis);
//out<<"RES "<<res<<endl;
break;
}
}
}
if( res==INF ) printf("-1\n");
else printf("%d\n",res);
}
}
return 0;
}