UVA10816 Travel in Desert

题目大意

沙漠中有一些道路,每个道路有一个温度和距离,要求s,t两点间的一条路径,满足温度最大值最小,并且长度最短

输入格式

输入包含多组数据。

每组数据第一行为两个整数\(n\) 和\(e\) 。表示绿洲数量和连接绿洲的道路数量。

每组数据第二行为两个整数\(s\) 和\(t\) 。表示起点和终点的绿洲编号。

接下来\(e\) 行,每行包含两个整数\(x,y\) 以及两个实数\(d,r\) ,表明在绿洲\(x\) 和\(y\) 之间有一条双向道路相连,长度为\(d\) ,温度为\(r\) 。

输出格式

对于输入的每组数据,应输出两行,第一行表示你找到的路线,第二行包含两个实数,为你找出的路线的总长度与途经的最高温度。

输入输出样例

输入样例#1:

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

输出样例#1:

1 3 6
38.3 38.3

题解

首先,说一下洛谷上翻译有坑,输入时是先输入温度\(r\),再输入长度\(d\)。

因为要让最大值最小,所以很容易想到二分,但快\(NOIP\)了还是练了一下最小瓶颈路。

首先有两道最小瓶颈路的题货车运输星际导航

我们发现这道题有两个限制温度和长度,不好处理,所以我们要去消除一层限制。

因为要首先保证最高温度尽量小,所以先考虑温度。

有些经验的都应该能想到最小瓶颈路,跑出\(s\)到\(t\)的最高温度的最小值\(maxtem\)。

然后把温度不大于\(maxtem\)的边加入图中,跑最短路记录路径即可。

code:

#include<iostream>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#define N 10005
#define INF 0x3f3f3f3f
#define R register
using namespace std;
template<typename T>inline void read(T &a){
char c=getchar();T x=0,f=1;
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
a=f*x;
}
int n,m,s,t,num,fa[N],tot,h[N];
double maxtem,dist[N];
bool vis[N];
vector<int> path;
struct MST{
int u,v;
double len,tem;
friend bool operator < (const MST &a,const MST &b){
return a.tem<b.tem;
}
}tre[N];
struct node{
int nex,to;
double dis;
}edge[N<<1];
inline void add(R int u,R int v,R double w){
edge[++tot].nex=h[u];
edge[tot].to=v;
edge[tot].dis=w;
h[u]=tot;
}
inline void ins(R int u,R int v,R double w,R double t){
tre[++num].u=u;
tre[num].v=v;
tre[num].len=w;
tre[num].tem=t;
}
inline int find(R int x){
if(x!=fa[x])fa[x]=find(fa[x]);
return fa[x];
}
struct HeapNode{
int u;
double d;
friend bool operator < (const HeapNode &a,const HeapNode &b){
return a.d>b.d;
}
};
priority_queue<HeapNode> q;
inline void dij(){
for(R int i=1;i<=n;i++)dist[i]=INF,vis[i]=0,fa[i]=0;
dist[s]=0;q.push((HeapNode){s,dist[s]});
while(!q.empty()){
R int x=q.top().u;q.pop();
if(vis[x])continue;vis[x]=1;
for(R int i=h[x];i;i=edge[i].nex){
R int xx=edge[i].to;
if(dist[xx]>dist[x]+edge[i].dis){
dist[xx]=dist[x]+edge[i].dis;
fa[xx]=x;
q.push((HeapNode){xx,dist[xx]});
}
}
}
R int x=t;
path.clear();
while(x!=s){
path.push_back(x);
x=fa[x];
}
path.push_back(s);
for(R int i=path.size()-1;i>=1;i--)
printf("%d ",path[i]);
printf("%d\n",path[0]);
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
num=tot=0;maxtem=0;
memset(h,0,sizeof(h));
memset(fa,0,sizeof(fa));
read(s);read(t);
R double w,te;
for(R int i=1,u,v;i<=m;i++){
read(u);read(v);scanf("%lf%lf",&te,&w);
ins(u,v,w,te);
}
for(R int i=1;i<=n;i++)fa[i]=i;
sort(tre+1,tre+1+m);
for(R int i=1;i<=m;i++){
R int x=find(tre[i].u),y=find(tre[i].v);
if(x!=y){
fa[x]=y;
maxtem=max(maxtem,tre[i].tem);
if(find(s)==find(t))break;
}
}
for(R int i=1;i<=m;i++){
if(tre[i].tem>maxtem)break;;
add(tre[i].u,tre[i].v,tre[i].len);
add(tre[i].v,tre[i].u,tre[i].len);
}
dij();
printf("%.1f %.1f\n",dist[t],maxtem);
}
return 0;
}

【UVA10816】Travel in Desert (最小瓶颈路+最短路)的更多相关文章

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

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

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

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

  3. 最小瓶颈路 Uva 534 Frogger

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

  4. UVALive 5713 Qin Shi Huang's National Road System秦始皇修路(MST,最小瓶颈路)

    题意: 秦始皇要在n个城市之间修路,而徐福声可以用法术位秦始皇免费修1条路,每个城市还有人口数,现要求徐福声所修之路的两城市的人口数之和A尽量大,而使n个城市互通需要修的路长B尽量短,从而使得A/B最 ...

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

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

  6. 【UVA534】Frogger 最小瓶颈路

    题目大意:给定一张 N 个点的完全图,求 1,2 号节点之间的一条最小瓶颈路. 题解:可知,最小瓶颈路一定存在于最小生成树(最小瓶颈树)中.因此,直接跑克鲁斯卡尔算法,当 1,2 号节点在同一个联通块 ...

  7. 【20181102T2】飞越行星带【智商题+最小瓶颈路】

    题面 [正解] 一眼不可做啊 --相当于求路线上穿过的点最小距离最大 最小最大--二分啊 现在相当于给一个直径,要判断这个直径是否能从左边穿到右边 我们可以在距离不超过直径的点连一条边,\(y=0\) ...

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

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

  9. HDU4081:Qin Shi Huang's National Road System (任意两点间的最小瓶颈路)

    Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/3 ...

随机推荐

  1. 关于iOS URL缓存机制原理解析

    关于URL缓存机制中   利用request对象判断是否缓存   其实request是否相等的判断依据是URLString是否相等

  2. 用 Markdown 写作(一)——添加文章页内导航

    Markdown 可以用更简化的标记来写文章,基本的语法可以参考Markdown 语法说明 (简体中文版). 我平时很少按照论文的写法去写博客,说来忏愧,因为很少写技术性的文章,最近看到百度百科和很多 ...

  3. ubuntu下搭建android开发环境

    注意: google可能被和谐了,那就修改hosts sudo vim /etc/hosts 增加: #Google主页 203.208.46.146 www.google.com #这行是为了方便打 ...

  4. SqlServer垂直分表 如何减少程序改动

    当单表数据太多时,我们可以水平划分,参考 SqlServer 分区视图实现水平分表 ,水平划分可以提高表的一些性能. 而 垂直分表 则相对很少见到和用到,因为这可能是数据库设计上的问题了.如果数据库中 ...

  5. 【#】Spring3 MVC 注解(二)---@RequestMapping

    博客分类:  spring MVC  1 问题:有多个 @RequestMapping @controller @RequestMapping("/aaa")           ...

  6. 基于AspNet Core2.0(测试版) 开发框架,包含简单的个人博客Demo

    大家好,最近离职了,利用闲暇时间就捣鼓了一个基于AspNet Core开发框架,分享出来希望能给AspNet Core学者带来一些帮助,同时也能跟大家一起学习.当然了,由于我的个人技术及经验的有限,框 ...

  7. java String,StringBuffer,StringBuilder区别及联系

    String 字符串常量(不可变)StringBuffer 字符串变量(线程安全,可变) StringBuilder 字符串变量(非线程安全,性能优,可变) 简要的说, String 类型和 Stri ...

  8. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(10):通过注解(annotation)装配Bean之(@Configguration、@Component、@Value、@ComponentScan、@Autowired、@Primary、@Qualifier、@Bean)

    一.通过注解(annotation)装配Bean 通过之前的学习,我们已经知道如何使用XML装配Bean,但是更多的时候已经不再推荐使用XML的方式去装配Bean,更多的时候会考虑注解(annotat ...

  9. 结构光和ToF

  10. mysql 数据库查询

    myspl   三部分  文件  服务  界面 查看数据库命令   show databases 创建数据库  create database  库名 删除数据库   drop database   ...