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

【题意】

  有n个绿洲, m条道路,每条路上有一个温度,和一个路程长度,从绿洲s到绿洲t,求一条道路的最高温度尽量小, 如果有多条, 选一条总路程最短的。

Input
Input consists of several test cases. Your program must process all of them.
The first line contains two integers N and E (1 ≤ N ≤ 100; 1 ≤ E ≤ 10000) where N represents the
number of oasis and E represents the number of paths between them. Next line contains two distinct
integers S and T (1 ≤ S, T ≤ N) representing the starting point and the destination respectively. The
following E lines are the information the group gathered. Each line contains 2 integers X, Y and 2 real
numbers R and D (1 ≤ X, Y ≤ N; 20 ≤ R ≤ 50; 0 < D ≤ 40). It means there is a path between X and
Y , with length D km and highest temperature RoC. Each real number has exactly one digit after the
decimal point. There might be more than one path between a pair of oases.
Output
Print two lines for each test case. The first line should give the route you find, and the second should
contain its length and maximum temperature.
Sample Input
6 9
1 6
1 2 37.1 10.2
2 3 40.5 20.7
3 4 42.8 19.0
3 1 38.3 15.8
4 5 39.7 11.1
6 3 36.0 22.5
5 6 43.9 10.2
2 6 44.2 15.2
4 6 34.2 17.4
Sample Output
1 3 6
38.3 38.3

 

 

【分析】

  我们可以先求出最大温度的最小值,然后把小于等于这个温度的边加进图中跑最短路。

  最短路就不说了,现在就是要求最小瓶颈路。

  最小瓶颈路有两个方法,

  1、二分+BFS 

    二分之后沿着小于等于这个温度的边走,只需判断能否走到终点,所以是mlogn的。

  2、

    但其实可以nlogn把图上所有两点的最小瓶颈路求出来,就是求出最小瓶颈树,那么两点之间的唯一路径就是他们的最小瓶颈路。

    而最小生成树就是一个最小瓶颈树。

  [其实这个,我也不是很会证明的说- -谁能告诉我- -]

 

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cstring>
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<queue>
  7 #include<cmath>
  8 using namespace std;
  9 #define Maxn 110
 10 #define Maxm 10010
 11 #define INF 0xfffffff
 12 
 13 int n,m,st,ed;
 14 
 15 struct node
 16 {
 17     int x,y,c,d;
 18     int next;
 19 }tt[Maxm],t[Maxm*2];
 20 int len,first[Maxn];
 21 
 22 bool cmp(node x,node y) {return x.c<y.c;}
 23 // double mymax(double x,double y) {return x>y?x:y;}
 24 int mymax(int x,int y) {return x>y?x:y;}
 25 
 26 int fa[Maxn];
 27 int ffa(int x)
 28 {
 29     if(fa[x]!=x) fa[x]=ffa(fa[x]);
 30     return fa[x];
 31 }
 32 
 33 void ins(int x,int y,int c)
 34 {
 35     t[++len].x=x;t[len].y=y;t[len].c=c;
 36     t[len].next=first[x];first[x]=len;
 37 }
 38 
 39 int mx[Maxn];
 40 void dfs(int x,int f)
 41 {
 42     for(int i=first[x];i;i=t[i].next) if(t[i].y!=f)
 43     {
 44         int y=t[i].y;
 45         mx[y]=mymax(mx[x],t[i].c);
 46         dfs(y,x);
 47     }
 48 }
 49 
 50 queue<int > q;
 51 int pre[Maxn],dis[Maxn];
 52 bool inq[Maxn];
 53 void spfa()
 54 {
 55     while(!q.empty()) q.pop();
 56     // for(int i=1;i<=n;i++) dis[i]=INF;
 57     memset(dis,63,sizeof(dis));
 58     memset(inq,0,sizeof(inq));
 59     q.push(ed);inq[ed]=1;dis[ed]=0;
 60     while(!q.empty())
 61     {
 62         int x=q.front();
 63         for(int i=first[x];i;i=t[i].next)
 64         {
 65             int y=t[i].y;
 66             if(dis[y]>dis[x]+t[i].c)
 67             {
 68                 dis[y]=dis[x]+t[i].c;
 69                 pre[y]=x;
 70                 if(!inq[y])
 71                 {
 72                     q.push(y);
 73                     inq[y]=1;
 74                 }
 75             }
 76         }
 77         inq[x]=0;q.pop();
 78     }
 79     if(dis[st]>=INF-10000) return;
 80     int now=st;
 81     while(now!=ed)
 82     {
 83         printf("%d ",now);
 84         now=pre[now];
 85     }
 86     printf("%d\n",ed);
 87     printf("%.1lf %.1lf\n",dis[st]*1.0/10,mx[st]*1.0/10);
 88 }
 89 
 90 int main()
 91 {
 92     while(scanf("%d%d",&n,&m)!=EOF)
 93     {
 94         scanf("%d%d",&st,&ed);
 95         for(int i=1;i<=m;i++)
 96         {
 97             double c,d;
 98             scanf("%d%d%lf%lf",&tt[i].x,&tt[i].y,&c,&d);
 99             tt[i].c=(int)round(c*10);tt[i].d=(int)round(d*10);
100         }
101         sort(tt+1,tt+1+m,cmp);
102         for(int i=1;i<=n;i++) fa[i]=i;
103         int cnt=0;
104         memset(first,0,sizeof(first));
105         len=0;
106         for(int i=1;i<=m;i++)
107         {
108             if(ffa(tt[i].x)!=ffa(tt[i].y))
109             {
110                 fa[ffa(tt[i].x)]=ffa(tt[i].y);
111                 cnt++;
112                 ins(tt[i].x,tt[i].y,tt[i].c);
113                 ins(tt[i].y,tt[i].x,tt[i].c);
114             }
115             if(cnt==n-1) break;
116         }
117         mx[ed]=0;
118         dfs(ed,0);
119         len=0;
120         memset(first,0,sizeof(first));
121         for(int i=1;i<=m;i++) if(tt[i].c<=mx[st])
122         {
123             ins(tt[i].x,tt[i].y,tt[i].d);
124             ins(tt[i].y,tt[i].x,tt[i].d);
125         }
126         spfa();
127     }
128     return 0; 
129 }
View Code

 

2016-11-01 15:57:34

转载于:https://www.cnblogs.com/Konjakmoyu/p/6019717.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

联想小新air14笔记本黑屏_联想小新air14锐龙版测评,谈谈它的好和坏

联想小新air14锐龙版本测评了解数码就找小侠客&#xff0c;我是机圈小侠客 今天呢&#xff0c;主要和大家测评一下联想小新air14这款笔记本&#xff0c;总体而言的话&#xff0c;这款笔记本它是一个。对于办公人士或者轻度游戏爱好者来说的话&#xff0c;是一个不错的选择&…

Java入门:Java下载与安装方法

本文适合刚入门的Java编程的初学者阅读。 JDK有两种下载方法&#xff0c;一个是官网下载&#xff0c;另一个是第三方网站下载。官网速度也许有点慢&#xff0c;慢的话可以考虑去第三方网站下载。 一、官网下载 1. 访问地址&#xff1a;http://www.oracle.com/cn/downloads/inde…

Java 7:如何编写非常快速的Java代码

当我第一次写此博客时&#xff0c;我的目的是向您介绍ThreadLocalRandom类&#xff0c;它是Java 7中新增的用于生成随机数的类。 我已在一系列微基准测试中分析了ThreadLocalRandom的性能&#xff0c;以了解其在单线程环境中的性能。 结果相对令人惊讶&#xff1a;尽管代码非常…

[地图开发][算法及数据结构]四叉树原理

参考&#xff1a;http://blog.csdn.net/zhouxuguang236/article/details/12312099 原博客地址还有c&#xff0b;&#xff0b;源码。。。 四叉树索引的基本思想是将地理空间递归划分为不同层次的树结构。它将已知范围的空间等分成四个相等的子空间&#xff0c;如此递归下去&…

按键 粘贴上一个命令_合并单元格、选择性粘贴的快捷键都是啥?今天一次告诉你……...

经常有人在群里问&#xff0c;合并单元格的快捷键是什么&#xff1f;选择性粘贴数值的快捷键是什么&#xff1f;今天就来聊聊快捷键的一些冷门知识……Alt键的作用快捷键其实就是一些组合键&#xff0c;主要用到Ctrl、shift、Alt这三个键其中之一或者是几个&#xff0c;再加上其…

Spring MVC和JQuery用于Ajax表单验证

在本教程中&#xff0c;我们将看到如何使用Ajax和Spring MVC和JQuery在服务器端验证表单。 Spring MVC为通过注释驱动的配置采用Ajax提供了非常方便的过程。 我们将使用此注释驱动的配置以JSON数据的形式发送Ajax响应。 响应将包含表单验证的状态&#xff0c;并且表单数据中存在…

Linux学习笔记——gzip命令

这个 gzip 程序被用来压缩一个或多个文件。当执行 gzip 命令时&#xff0c;则原始文件的压缩版会替代原始文件。 相对应的 gunzip 程序被用来把压缩文件复原为没有被压缩的版本。gzip 选项&#xff1a;选项 说明-c把输出写入到标准输出&#xff0c;并且保留原始文件。也有可能用…

java集合类——Stack类

查看java的API文档&#xff0c;Stack继承Vector类。 栈的特点是后进先出。 API中Stack自身的方法不多&#xff0c;基本跟栈的特点有关。 Java代码 import java.util.Stack; public class StackTest { public static void main(String[] args) { Stack&l…

免装版_无缝贴图制作软件 PixPlant2中文免装版

点击上方蓝字关注我们如您喜欢我们的公众号&#xff0c;不妨推荐给身边的朋友资源介绍&#xff1a;资源来源于网络&#xff0c;很多时候我们从网上找的贴图并不是无缝的&#xff0c;而且一般都没有高光/法线贴图这些&#xff0c;在材质的模拟上就要差了很多&#xff0c;在这里小…

Java中使用Map and Fold进行功能性编程

在函数式编程中&#xff0c;Map和Fold是两个非常有用的运算符&#xff0c;它们属于每种函数式语言。 如果Map和Fold运算符是如此强大且必不可少&#xff0c;那么您如何解释说即使Java编程语言缺少这两个运算符&#xff0c;我们也可以使用Java来完成工作&#xff1f; 事实是&…

Mysql 分页语句Limit用法

Mysql 分页语句Limit用法 1、Mysql的limit用法 在我们使用查询语句的时候&#xff0c;经常要返回前几条或者中间某几行数据&#xff0c;这个时候怎么办呢&#xff1f;不用担心&#xff0c;mysql已经为我们提供了这样一个功能。 Sql代码 SELECT * FROM table LIMIT [offset,] r…

波纹扩散_C4D_动画amp;RS波纹扩散效果J_014

C4D-效果扩散效果&#xff0c;Redshift混合冰材质&#xff1b;利用顶点贴图扩散效果制作&#xff0c;RS混合调用顶点贴图。视频教程时长22分钟。对象为可编辑对象才能用顶点贴图。冰结域的扩展是这个动画的重点&#xff0c;在这个模式下&#xff0c;权重会根据半径向外扩展&…

软件测试工程师简历项目经验怎么写?--9999个已成功入职的软件测试工程师真实简历

简历是我们求职的第一步&#xff0c;也是非常重要的一步。 青云叔叔看过太多简历&#xff0c;最快3秒就淘汰一份简历&#xff0c;因为其实我们每天要收到很多简历进行筛选&#xff0c;那么面试官其实也是会很快进行对简历进行判断的&#xff0c;如果你对简历写的一塌糊涂&…

【poj2464】树状数组

这道题。。太特么多细节了。。 题意&#xff1a;在平面直角坐标系中给你N个点&#xff0c;stan和ollie玩一个游戏&#xff0c;首先stan在竖直方向上画一条直线&#xff0c;该直线必须要过其中的某个点&#xff0c;然后ollie在水平方向上画一条直线&#xff0c;该直线的要求是要…

azure git怎么使用_Azure(一)Azure Traffic Manager为我们的Web项目提供负载均衡

一&#xff0c;引言上一篇讲到我们将自己的Net Core Web 项目部署到 Azure 的 Web App 的一项 pass 服务&#xff0c;假如随着项目的日益增长的访问量&#xff0c;之前部署到单节点的应用可能无法保证其稳定性&#xff0c;可能会导致系统宕机等等问题&#xff0c;这个时候&…

文字描边_如何在网页里实现文字描边效果

文字描边想要在网页里实现文本描边效果&#xff0c;在以前只能使用Photoshop等来实现&#xff0c;但现在只需要一个text-stroke属性&#xff0c;即可轻松做到文本描边&#xff0c;渐变文本描边&#xff0c;甚至图片文本描边。01语法text-stroke: text-stroke是一个复合属性&…

javascript数据结构-栈

github博客地址 栈&#xff08;stack&#xff09;又名堆栈&#xff0c;它是一种运算受限的线性表。遵循后进先出原则&#xff0c;像垃圾桶似的。功能实现依然按照增删改查来进行&#xff0c;内部数据存储可以借用语言原生支持的数组。 栈类 function Stack(){this.data []; }添…

”二柱子“个人项目

”二柱子“个人项目 关于二柱子的个人项目&#xff0c;据说……是这么发生的…… 二柱子因为懒(,,• ₃ •,,)&#xff0c;要给他上小学的儿子编写个能够出小学四则运算题目的程序。老师上课的时候又添加了条件&#xff1a; 1、打印至少30道题 2、除了整数之外&#xff0c;还要…

Eclipse中的集成Git插件删除线上远程分支

Eclipse 的忠实党,在使用Git 多人协作以分支的形式开发应用时分支合并到主干后往往再没什么用(我的做法是保留一两周再干掉),在此记录使用Eclipse的Git 插件来删除无用的分支。 操作步骤: 项目右键 — Team — Remote — Push — Next — Finesh 1,下拉框选择你要删除的远程分支…

从MongoDB GridFS流式传输文件

不久前&#xff0c;我在Twitter上发布了自己的最新作品&#xff0c;即从MongoDB GridFS传输文件进行下载&#xff08;而不是将整个文件存储到内存中然后提供服务&#xff09;&#xff0c;这是我取得的一个小胜利。 我答应就此事写博客&#xff0c;但不幸的是&#xff0c;我的特…