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

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

代码如下:

  1. # include<iostream>
  2. # include<cstdio>
  3. # include<queue>
  4. # include<cstring>
  5. # include<algorithm>
  6. using namespace std;
  7. # define LL long long
  8. # define REP(i,s,n) for(int i=s;i<n;++i)
  9. # define CL(a,b) memset(a,b,sizeof(a))
  10. # define CLL(a,b,n) fill(a,a+n,b)
  11.  
  12. const int N=105;
  13. const int INF=1<<30;
  14. const double inf=1e10;
  15.  
  16. struct Edge
  17. {
  18. int fr,to;
  19. double d,r;
  20. bool operator < (const Edge &a) const {
  21. if(r==a.r) return d<a.d;
  22. return r<a.r;
  23. }
  24. };
  25. Edge e[N*100];
  26. int n,m,fa[N],vis[N],pre[N];
  27. double G[N][N],dis[N],ansr;
  28.  
  29. int findFa(int u)
  30. {
  31. if(fa[u]!=u)
  32. return fa[u]=findFa(fa[u]);
  33. return u;
  34. }
  35.  
  36. void kruskal(int s,int t)
  37. {
  38. REP(i,0,n) fa[i]=i;
  39. REP(i,0,n) REP(j,0,n) G[i][j]=inf;
  40. REP(i,0,m){
  41. ansr=e[i].r;
  42. int fr=e[i].fr;
  43. int to=e[i].to;
  44. int u=findFa(fr);
  45. int v=findFa(to);
  46. if(u!=v)
  47. fa[u]=v;
  48. if(findFa(s)==findFa(t))
  49. break;
  50. }
  51. REP(i,0,m) if(e[i].r<=ansr)
  52. 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);
  53. }
  54.  
  55. void dijkstra(int s)
  56. {
  57. CLL(dis,inf,n);
  58. REP(i,0,n) pre[i]=i;
  59. dis[s]=0.0;
  60. queue<int>q;
  61. q.push(s);
  62. while(!q.empty())
  63. {
  64. int u=q.front();
  65. q.pop();
  66. vis[u]=0;
  67. REP(i,0,n){
  68. if(dis[i]>dis[u]+G[u][i]){
  69. dis[i]=dis[u]+G[u][i];
  70. pre[i]=u;
  71. if(!vis[i]){
  72. vis[i]=1;
  73. q.push(i);
  74. }
  75. }
  76. }
  77. }
  78. }
  79.  
  80. void print(int u)
  81. {
  82. if(pre[u]==u){
  83. printf("%d",u+1);
  84. }else{
  85. print(pre[u]);
  86. printf(" %d",u+1);
  87. }
  88. }
  89.  
  90. int main()
  91. {
  92. int s,t;
  93. while(~scanf("%d%d",&n,&m))
  94. {
  95. scanf("%d%d",&s,&t);
  96. REP(i,0,m){
  97. cin>>e[i].fr>>e[i].to>>e[i].r>>e[i].d;
  98. --e[i].fr,--e[i].to;
  99. }
  100. sort(e,e+m);
  101. kruskal(s-1,t-1);
  102. dijkstra(s-1);
  103. print(t-1);
  104. printf("\n");
  105. printf("%.1lf %.1lf\n",dis[t-1],ansr);
  106. }
  107. return 0;
  108. }

  

UVA-10816 Travel in Desert (最小瓶颈最短路)的更多相关文章

  1. uva 10816 Travel in Desert(简单的好题~两种方法)

    题意: 给出 一个图 点与点之间的路径上有两个权值 路径长度和温度 要求在所走路径中的温度的最大值最小的前提下 走最短路径 解题思路1: 首先用 最小生成树 的方法走出 最小瓶颈路 .把在这期间用到的 ...

  2. 【UVA 11354】 Bond (最小瓶颈生成树、树上倍增)

    [题意] n个点m条边的图 q次询问 找到一条从s到t的一条边 使所有边的最大危险系数最小 InputThere will be at most 5 cases in the input file.T ...

  3. UVa 11354 邦德(最小瓶颈路+LCA)

    https://vjudge.net/problem/UVA-11354 题意: 有n个城市m条道路,每条道路有一个危险系数.先在有若干个询问,要求找到一条从s到t的路,使得途径所有边的最大危险系数最 ...

  4. 【UVA 10816】 Travel in Desert (最小瓶颈树+最短路)

    [题意] 有n个绿洲, m条道路,每条路上有一个温度,和一个路程长度,从绿洲s到绿洲t,求一条道路的最高温度尽量小, 如果有多条, 选一条总路程最短的. InputInput consists of ...

  5. 【UVA10816】Travel in Desert (最小瓶颈路+最短路)

    UVA10816 Travel in Desert 题目大意 沙漠中有一些道路,每个道路有一个温度和距离,要求s,t两点间的一条路径,满足温度最大值最小,并且长度最短 输入格式 输入包含多组数据. 每 ...

  6. 最小瓶颈路 Uva 534 Frogger

    说明:关于Uva的题目,可以在vjudge上做的,不用到Uva(那个极其慢的)网站去做. 最小瓶颈路:找u到v的一条路径满足最大边权值尽量小 先求最小生成树,然后u到v的路径在树上是唯一的,答案就是这 ...

  7. UVA 11354 Bond 邦德 (RMQ,最小瓶颈MST)

    题意: n个城市,m条路,每条路有个危险值,要使得从s走到t的危险值最小.回答q个询问,每个询问有s和t,要求输出从s到t最小的危险值.(5万个点,10万条边) 思路: 其实要求的是任意点对之间的最小 ...

  8. UVA 11354 Bond(最小瓶颈路+倍增)

    题意:问图上任意两点(u,v)之间的路径上,所经过的最大边权最小为多少? 求最小瓶颈路,既是求最小生成树.因为要处理多组询问,所以需要用倍增加速. 先处理出最小生成树,prim的时间复杂度为O(n*n ...

  9. 【uva 534】Frogger(图论--最小瓶颈路 模版题)

    题意:平面上有N个石头,给出坐标.一只青蛙从1号石头跳到2号石头,使路径上的最长便最短.输出这个值.(2≤N≤200) 解法:最小瓶颈树.而由于这题N比较小便可以用2种方法:1.最短路径中提到过的Fl ...

随机推荐

  1. Find them, Catch them---poj1703(并查集)

    题目链接:http://poj.org/problem?id=1703 可以认为n个人和m句话: 每句话包含A a b;D a b; 刚开始关系不确定: A a b 就是问ab 是否同类: D a b ...

  2. Day01 html详解

      day01 html详解   1.html的简介     1.1 什么是html?         - HyperText Markup Language:超文本标记语言,网页语言         ...

  3. OC如何跳到系统设置里的各种设置界面

    当 iOS系统版本 <= iOS7时 , 只能跳转到 系统设置页面 ,楼主试了下,非真机是没有任何效果的 当iOS系统版本 < iOS 10.0 时 NSURL *url= [NSURL ...

  4. linux问题点滴,给普通用户添加sudo权限

    最近又把linux捡起来了,虚拟机中安个元老级centos5.3继续搞.使用sudo临时获取超管权限命令时,提示”xxx is not in the sudoers file. This incide ...

  5. (转) 密码学中的“盐值 Salt”

    为什么要在密码里加点“盐” 盐(Salt) 在密码学中,是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为“加盐”. 以上这句话是维基百科上对于 ...

  6. 数据挖掘-聚类分析(Python实现K-Means算法)

    概念: 聚类分析(cluster analysis ):是一组将研究对象分为相对同质的群组(clusters)的统计分析技术.聚类分析也叫分类分析,或者数值分类.聚类的输入是一组未被标记的样本,聚类根 ...

  7. SpringData概述

    Spring Data : Spring 的一个子项目.用于简化数据库访问,支持NoSQL 和 关系数据存储.其主要目标是使数据库的访问变得方便快捷. SpringData 项目所支持 NoSQL 存 ...

  8. js判断浏览器的类型和获得浏览器的版本

    <!DOCTYPE html><html>    <head>        <meta charset="UTF-8">      ...

  9. Mybatis 之动态代理

    使用Mybatis 开发Web 工程时,通过Mapper 动态代理机制,可以只编写接口以及方法的定义. 如下: 定义db.properties driver=oracle.jdbc.OracleDri ...

  10. Spring的一些面试题(转)

    一.spring工作原理: 1.spring mvc的所有请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工作.2.DispatcherServlet ...