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. alinode 配置 pm2

    今天公司要配置阿里的一个node.js性能监控(alinode),这个东西看似配置很简单但是你不知道你配置对没对, 因为他需要1分钟后才能显示出来,而且模块依赖我等了10分钟才出来, 文档的链接htt ...

  2. vmware Selinux配置错误,导致无法启动虚拟机

    Linux 开机提示kernel panic - not syncing: Attempted to kill init! 解决方法: 系统启动的时候,按下‘e’键进入grub编辑界面,编辑grub菜 ...

  3. ubuntu安装meshlab

    ubuntu安装meshlab https://github.com/nine7nine/meshlab.git

  4. docker镜像存出与载入

    尝试从官网上下载ubuntu镜像,太慢下载不下来. 使用daocloud加速器进行加速之后,由于公司网络不好,仍然下载不下来. 没办法,只能从别的环境上搞一个已经存在的ubuntu镜像,折腾到自己的虚 ...

  5. cookie与session组件

    会话跟跟踪技术 cookie介绍 Djanjo中操作Cookle Session Django中Session相关方法 Django中的Session配置 CBV中加装饰器 session中运用aja ...

  6. clickonce发布winform必备组件

    ClickOnce 发布,在系统必备中勾选了 .NET Framework 4,并选择了"从与我的应用程序相同的位置下载系统必备组件"时,执行发布,会提示缺少很多文件 使用 Pac ...

  7. HDU 6053 TrickGCD (莫比乌斯函数)

    题意:给一个序列A,要求构造序列B,使得 Bi <= Ai, gcd(Bi) > 1, 1 <= i <= n, 输出构造的方法数. 析:首先这个题直接暴力是不可能解决的,可以 ...

  8. 重装ubuntu

    重装前 需要备份软件.配置文件等,重装系统时,最好不要重新给/home分区,也不要格式化,要不你需要备份很多东西,重装后也需要做很多设置.也就是说/home不格式化,整个重装系统都是很快的.最多花10 ...

  9. HttpUploader6-queue版本更新说明

    HttpUploader6-queue版本更新说明 博客园:http://www.cnblogs.com/xproer/p/5109761.html 网易博客:http://hyhyo.blog.16 ...

  10. js对象 1字符串对象2时间日期对象3数字对象

    1字符串对象  直接对字符操作 var str = "这,是,不,是,字,符,串";        //字符串转数组  字符串.split(分隔符)        var arr ...