Problem Description
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
|
Author
ailyanlu
|
Source
HDU 2007-Spring Programming Contest - Warm Up (1)
|
用并查集找出所有的相通的路径,取最小值
#include<iostream>
#include<algorithm>
using namespace std;
int N,M;
#define Min(a,b) a<b?a:b
typedef struct node{
int s;
int d;
int speed;
}Node;
bool compare(Node a,Node b)
{
return a.speed<b.speed;
}
Node nodes[1007];
int parent[300];
void init(int n)
{
for(int i=1;i<=n;i++)
{
parent[i]=-1;
}
}
int find(int i)
{
while(parent[i]>0)
{
i=parent[i];
}
return i;
}
void combine(int a,int b)
{
parent[a]=b;
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&N,&M)!=EOF)
{
int a,b,s;
for(int i=0;i<M;i++)
{
cin>>a>>b>>s;
nodes[i].s=a;
nodes[i].d=b;
nodes[i].speed=s;
}
sort(nodes,nodes+M,compare);
int count;
cin>>count;
for(int k=0;k<count;k++)
{
int min=1000000;
int a=0,b=0;
cin>>a>>b;
for(int m=0;m<M;m++)
{
init(N);
for(int n=m;n<M;n++)
{
int p1=find(nodes[n].s);
int p2=find(nodes[n].d);
if(p1!=p2)combine(p1,p2);
if(find(a)==find(b))
{
min=Min(min,nodes[n].speed-nodes[m].speed);
break;
}
}
}
if(min!=1000000)
{
cout<<min<<endl;
}
else{
cout<<"-1"<<endl;
}
}
}
return 0;
}