• 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;
    }
    

      

  • 相关阅读:
    Django(一)创建第一个Django的demo
    使用webdriver扒取网站小说(二)-----进阶篇(分层数据驱动)
    【求解答】在eclipse中运行Android项目出现的问题 ——Launching MyFirstAPP' has encountered a program. Errors occurred during the build.
    今天想写一点简单的东西-关于计算机算法的
    新的朋友
    Java基础回顾(3)
    java基础回顾(2)
    java基础回顾(一)
    Asp.Net Mvc AutoFac 的简单使用
    微信文件记录删除
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/4930784.html
Copyright © 2020-2023  润新知