HDU1598 find the most comfortable road【最小生成树】

题目链接:HDU1598 find the most comfortable road

题意:询问xy所有路径上mx-mn的最小值;

分析:枚举每一条边作为最小生成树的最小边,直到xy连通时更新答案,用当前-最小边更新,有可能会出现将无用边算入答案的情况,但后面会把答案改小,所以不影响;

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
const int maxn=2e5+7;
const int mod=1e9+7;
const int INF=0x7f7f7f7f;
int n,m,u,v,pre[maxn];
struct node{int x,y,z;} p[maxn];
bool cmp(node a,node b) {return a.z<b.z;}
int find(int x) {return (x==pre[x])?x:pre[x]=find(pre[x]);}
void merge(int x,int y)
{
    int fx=find(x),fy=find(y);
    if(fx!=fy) pre[fx]=fy;
}
int check(int x)
{
    int cnt=0;
    for(int i=0;i<=n;i++) pre[i]=i;
    for(int i=x;i<=m;i++)
    {
        int xx=p[i].x,yy=p[i].y;
        merge(xx,yy);
        if(find(u)==find(v)) return p[i].z-p[x].z;
    }
    return INF;
}
void rua()
{
    for(int i=1;i<=m;i++)scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z);
    sort(p+1,p+1+m,cmp);
    int q;scanf("%d",&q);
    while(q--)
    {
        int ans=INF;
        scanf("%d%d",&u,&v);
        for(int i=1;i<=m;i++) ans=min(ans,check(i));
        if(ans==INF) ans=-1;
        printf("%d\n",ans);
    }
}
int main()
{
    while(~scanf("%d%d",&n,&m)) rua();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43813163/article/details/104707396