zoukankan      html  css  js  c++  java
  • hdu 1598 find the most comfortable road 夜

    这题刚开始没想到要用并查集 结果没做出来

    最后堕落了 查了一下别人的答案才知道的

    先把边排序 由于边不多所以可以枚举任意两边和他们中间的边(排序后的)

    如果使得两地点连接 则求出最大差 所以符合的情况的最大差中最小的便是答案

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

     

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<math.h>
    using namespace std;
    struct node//保存边信息
    {
        int x,y,w;
    }mem[1001];
    int f[201];//并查集父节点
    bool cmp(node a,node b)
    {
        return a.w<b.w;
    }
    inline int find(int i)//并查集寻父节点函数 你懂得
    {
        if(f[i]!=i)

        f[i]=find(f[i]);
        return f[i];
    }
    int main()
    {
        int Q,n,m,i,j,w,mmin,start,end;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
           for(i=0;i<m;i++)

           scanf("%d%d%d",&mem[i].x,&mem[i].y,&mem[i].w);
           sort(mem,mem+m,cmp);//排序
           scanf("%d",&Q);
           while(Q--)
           {

           mmin=10000001;
            scanf("%d%d",&start,&end);
        for(i=0;i<m;i++)
        {
            for(j=1;j<=n;j++)//初始化并查集

            f[j]=j;
            for(j=i;j<m;j++)
            {
            if(find(mem[j].x)!=find(mem[j].y))

                f[find(mem[j].x)]=find(mem[j].y);
            if(find(start)==find(end))
                break;//已联通
            }
            if(j<m)
            {
            if(mem[j].w-mem[i].w<mmin)

                mmin=mem[j].w-mem[i].w;

            }
        }
        if(mmin==10000001)

            printf("-1\n");
        else

                printf("%d\n",mmin);
           }
        }

        return 0;
    }

  • 相关阅读:
    -_-#【缓存】Content-Type 错误
    ♫【事件】事件处理程序
    -_-#【Node】Express 400 Error: ENOENT, open
    【JS】定位
    【JS】壹零零壹
    洛谷—— P1018 乘积最大
    洛谷—— P1017 进制转换
    洛谷——P1011 车站
    洛谷——P2241 统计方形(数据加强版)
    洛谷——P1548 棋盘问题
  • 原文地址:https://www.cnblogs.com/liulangye/p/2260460.html
Copyright © 2011-2022 走看看