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. Linux下安装Nginx详细图解教程(一)

    什么是Nginx? Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器,在高连接并发的情况下N ...

  2. 虚拟机上linux与windows之间复制粘贴

    参考:https://blog.csdn.net/qq_34501940/article/details/51222119

  3. Anaconda 安装和配置

    Anaconda 安装和配置 1. Anaconda 安装 Anaconda说明及安装过程:Anaconda详细安装使用教程 2. Anaconda和Pip源修改 Anaconda源修改:打开Anac ...

  4. Linux 上安装 rlwrap

    1.安装rlwrap的初衷; 2.安装rlwrap工具和遇到的问题; 3.使用rlwrap 工具; 1.安装rlwrap的初衷: 在Windows 下使用SQLPLUS都是可以使用上下左右方向键前后左 ...

  5. 1146 ID Codes

    题目链接: http://poj.org/problem?id=1146 题意: 给定一个字符串(长度不超过50), 求这个字符串的下一个字典序的字符串, 如果已经是最大字典序, 那么输出 " ...

  6. ubuntu 16.04安装ceph集群(双节点)

    Ceph是一个分布式存储,可以提供对象存储.块存储和文件存储,其中对象存储和块存储可以很好地和各大云平台集成.一个Ceph集群中有Monitor节点.MDS节点(可选,用于文件存储).至少两个OSD守 ...

  7. Yii2 集成 adminlteasset

    https://github.com/dmstr/yii2-adminlte-asset AdminLTE Asset Bundle Backend UI for Yii2 Framework, ba ...

  8. 编写高质量代码改善C#程序的157个建议——建议62:避免嵌套异常

    建议62:避免嵌套异常 应该允许异常在调用堆栈上往上传,不要过多的使用catch,然后再throw.过多的使用catch会带来两个问题: 1)代码更多了.这看上去好像你根本不知道怎么处理异常,所以你总 ...

  9. CSS 形状绘制

                                      最后一个 先放代码 <style type="text/css"> #heart { positio ...

  10. delphi中的sql语句中空格问题

    sql语句中的冒号 ‘’,在delphi中需要用四个冒号表示 ‘’‘’,delphi中的两个冒号只代表一个冒号