hdu 1598 并查集,kruskal

来源:互联网 发布:和风天气json解析封装 编辑:程序博客网 时间:2024/05/22 13:55

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1598

先排序,i 一定为最小权值边,j 一定为最大边,找差值最小

kruskal生成树过程中,start和end连通即可停止,在 i 的循环里找出最小差值。

#include<string.h>#include<stdio.h>#include<algorithm>using namespace std;const int inf=999999999;int n,m,q,fa[210];struct edge{    int x,y,len;}e[1010];bool cmp(edge a,edge b){    return a.len<b.len;}int find(int x){    return fa[x] != x ? fa[x] = find(fa[x]) : x;}int solve(int a,int b){    int minn=inf;    for(int i=1;i<=m;i++){        for(int j=1;j<=n;j++)            fa[j]=j;        for(int j=i;j<=m;j++){            int t1=find(e[j].x);            int t2=find(e[j].y);            if(t1!=t2)                fa[t2]=t1;            if(find(a)==find(b)){                 minn = min(minn, e[j].len-e[i].len); //                 break;            }        }    }    if(minn==inf)        minn=-1;    return minn;}int main(){    int i,j,a,b,t;    while(~scanf("%d%d",&n,&m)){        for(i=1;i<=m;i++)            scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].len);        sort(e+1,e+m+1,cmp);        scanf("%d",&t);        while(t--){            scanf("%d%d",&a,&b);            printf("%d\n",solve(a,b));        }    }    return 0;}