• UVA-10816 Travel in Desert (最小瓶颈最短路)


    题目大意:给一张无向图,图中的每条边都有两个权值,长度d和热度r。找出从起点到终点的一条最大热度最小的路径,如果这样的路径有多条,选择一个最短的。

    题目分析:如果只考虑最小的最大热度,那么本题就是一个最小瓶颈路问题,只需按照热度找一棵最小生成树即可。但是,如果这样的路径有多个,实际上是最小生成树有多个时,要找到最短路径,还得把热度不大于最小生成树中最大热度的边并且没在生成树中的边加到最小生成树中,然后再找最短路。

    代码如下:

    # include<iostream>
    # include<cstdio>
    # include<queue>
    # include<cstring>
    # include<algorithm>
    using namespace std;
    # define LL long long
    # define REP(i,s,n) for(int i=s;i<n;++i)
    # define CL(a,b) memset(a,b,sizeof(a))
    # define CLL(a,b,n) fill(a,a+n,b)
    
    const int N=105;
    const int INF=1<<30;
    const double inf=1e10;
    
    struct Edge
    {
        int fr,to;
        double d,r;
        bool operator < (const Edge &a) const {
            if(r==a.r) return d<a.d;
            return r<a.r;
        }
    };
    Edge e[N*100];
    int n,m,fa[N],vis[N],pre[N];
    double G[N][N],dis[N],ansr;
    
    int findFa(int u)
    {
        if(fa[u]!=u)
            return fa[u]=findFa(fa[u]);
        return u;
    }
    
    void kruskal(int s,int t)
    {
        REP(i,0,n) fa[i]=i;
        REP(i,0,n) REP(j,0,n) G[i][j]=inf;
        REP(i,0,m){
            ansr=e[i].r;
            int fr=e[i].fr;
            int to=e[i].to;
            int u=findFa(fr);
            int v=findFa(to);
            if(u!=v)
                fa[u]=v;
            if(findFa(s)==findFa(t))
                break;
        }
        REP(i,0,m) if(e[i].r<=ansr)
            G[e[i].fr][e[i].to]=G[e[i].to][e[i].fr]=min(G[e[i].fr][e[i].to],e[i].d);
    }
    
    void dijkstra(int s)
    {
        CLL(dis,inf,n);
        REP(i,0,n) pre[i]=i;
        dis[s]=0.0;
        queue<int>q;
        q.push(s);
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            vis[u]=0;
            REP(i,0,n){
                if(dis[i]>dis[u]+G[u][i]){
                    dis[i]=dis[u]+G[u][i];
                    pre[i]=u;
                    if(!vis[i]){
                        vis[i]=1;
                        q.push(i);
                    }
                }
            }
        }
    }
    
    void print(int u)
    {
        if(pre[u]==u){
            printf("%d",u+1);
        }else{
            print(pre[u]);
            printf(" %d",u+1);
        }
    }
    
    int main()
    {
        int s,t;
        while(~scanf("%d%d",&n,&m))
        {
            scanf("%d%d",&s,&t);
            REP(i,0,m){
                cin>>e[i].fr>>e[i].to>>e[i].r>>e[i].d;
                --e[i].fr,--e[i].to;
            }
            sort(e,e+m);
            kruskal(s-1,t-1);
            dijkstra(s-1);
            print(t-1);
            printf("
    ");
            printf("%.1lf %.1lf
    ",dis[t-1],ansr);
        }
        return 0;
    }
    

      

  • 相关阅读:
    博客园界面部分优化
    jQuery获取Select选择的Text和 Value
    java开发各层对象含义
    接口与抽象类的区别(完整描述)
    Map相关知识总结
    html引用外部js和css
    RDD内存迭代原理(Resilient Distributed Datasets)---弹性分布式数据集
    spark高可用集群搭建及运行测试
    spark集群的简单测试和基础命令的使用
    spark集群搭建
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/4930784.html
Copyright © 2020-2023  润新知