您的位置:首页 > 其它

HDU 1598 find the most comfortable road

2016-07-23 19:17 239 查看
题意:

给你n<=200个点m<=1000条道路的无向图,每条道路有一个时速,有q<=10个询问,问你从s到e的路径中min(最大时速-最小时速)。

思路:

先将边从小到大排,然后枚举每一条边作为起始边,然后去枚举比它大的边,用并查集不断维护这个图,直到s和e都加入后比较ans和(最后一条加入的边-起始边)。

#include<cstdio>
#include<algorithm>
using namespace std;

const int INF=0x3f3f3f3f;
const int MAXN=205;
const int MAXM=1005;

struct Edge{
int u,v,w;
}edge[MAXM];

int n,m,q,fa[MAXN];

bool cmp(Edge a,Edge b){
return a.w<b.w;
}

void init(){
for(int i=1;i<=n;i++){
fa[i]=i;
}
}

int Find(int x){
int r=x,t;
while(r!=fa[r]){
r=fa[r];
}
while(x!=r){
t=fa[x];
fa[x]=r;
x=t;
}
return r;
}

void Union(int u,int v){
int a=Find(u);
int b=Find(v);
if(fa[a]!=b){
fa[a]=b;
}
}

int main(){
while(~scanf("%d%d",&n,&m)){
for(int i=1;i<=m;i++){
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
}
sort(edge+1,edge+1+m,cmp);
scanf("%d",&q);
while(q--){
int s,e,ans=INF;
scanf("%d%d",&s,&e);
for(int i=1;i<=m;i++){
init();
for(int j=i;j<=m;j++){
Union(edge[j].u,edge[j].v);
if(Find(s)==Find(e)){
ans=min(ans,edge[j].w-edge[i].w);
}
}
}
if(ans!=INF) printf("%d\n",ans);
else printf("-1\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: