1.题目编号:1017
2.简单题意:XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流,每条SARS都对行驶在上面的Flycar限制了固定的Speed,同时XX星人对 Flycar的“舒适度”有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服 ,但XX星人对时间却没那么多要求。要你找出一条城市间的最舒适的路径。
3.解题思路形成过程:题目中说要求找最舒适的路径,而最舒适的路径是在乘坐过程中最低速度和最高速度之间的差小的路径,先把这个边按权值把排序,然后枚举,就能把最小差求出来了
4.感悟:用了sort却忘了头文件=.=
5.AC的代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#define MAX 1000001
#define min(a,b) (a)<(b)?(a):(b)
using namespace std;
struct Edge
{
int from;
int to;
int weight;
}edge[1002];
int n,m;
int set[1002];
void init()
{
for(int i=0;i<m;i++)
set[i] = i;
}
int find(int n)
{
return n == set[n] ? n : set[n] = find(set[n]);
}
void setUnion(int a,int b)
{
if(find(a)!=find(b))
set[find(b)] = find(a);
}
int cmp(Edge a,Edge b)
{
return a.weight<b.weight;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int i;
for(i=0;i<m;i++)
scanf("%d%d%d",&edge[i].from,&edge[i].to,&edge[i].weight);
sort(edge,edge+m,cmp);
int q;
scanf("%d",&q);
for(i=0;i<q;i++)
{
bool bo = false;
int from,to;
scanf("%d%d",&from,&to);
int ans = MAX;
for(int j=0;j<m;j++)
{
if(bo)
break;
init();
for(int k=j;k>=0;k--)
{
setUnion(edge[k].from,edge[k].to);
if(find(from) == find(to))
{
ans = min(ans,edge[j].weight - edge[k].weight);
}
}
}
if(ans!=MAX)
printf("%d\n",ans);
else
printf("-1\n");
}
}
}
原题:
4 4 1 2 2 2 3 4 1 4 1 3 4 2 2 1 3 1 2
1 0