【UVA10816】Travel in Desert (最小瓶颈路+最短路)
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 (最小瓶颈路+最短路)的更多相关文章
- UVA-10816 Travel in Desert (最小瓶颈最短路)
题目大意:给一张无向图,图中的每条边都有两个权值,长度d和热度r.找出从起点到终点的一条最大热度最小的路径,如果这样的路径有多条,选择一个最短的. 题目分析:如果只考虑最小的最大热度,那么本题就是一个 ...
- 【UVA 10816】 Travel in Desert (最小瓶颈树+最短路)
[题意] 有n个绿洲, m条道路,每条路上有一个温度,和一个路程长度,从绿洲s到绿洲t,求一条道路的最高温度尽量小, 如果有多条, 选一条总路程最短的. InputInput consists of ...
- 最小瓶颈路 Uva 534 Frogger
说明:关于Uva的题目,可以在vjudge上做的,不用到Uva(那个极其慢的)网站去做. 最小瓶颈路:找u到v的一条路径满足最大边权值尽量小 先求最小生成树,然后u到v的路径在树上是唯一的,答案就是这 ...
- UVALive 5713 Qin Shi Huang's National Road System秦始皇修路(MST,最小瓶颈路)
题意: 秦始皇要在n个城市之间修路,而徐福声可以用法术位秦始皇免费修1条路,每个城市还有人口数,现要求徐福声所修之路的两城市的人口数之和A尽量大,而使n个城市互通需要修的路长B尽量短,从而使得A/B最 ...
- UVA 11354 Bond(最小瓶颈路+倍增)
题意:问图上任意两点(u,v)之间的路径上,所经过的最大边权最小为多少? 求最小瓶颈路,既是求最小生成树.因为要处理多组询问,所以需要用倍增加速. 先处理出最小生成树,prim的时间复杂度为O(n*n ...
- 【UVA534】Frogger 最小瓶颈路
题目大意:给定一张 N 个点的完全图,求 1,2 号节点之间的一条最小瓶颈路. 题解:可知,最小瓶颈路一定存在于最小生成树(最小瓶颈树)中.因此,直接跑克鲁斯卡尔算法,当 1,2 号节点在同一个联通块 ...
- 【20181102T2】飞越行星带【智商题+最小瓶颈路】
题面 [正解] 一眼不可做啊 --相当于求路线上穿过的点最小距离最大 最小最大--二分啊 现在相当于给一个直径,要判断这个直径是否能从左边穿到右边 我们可以在距离不超过直径的点连一条边,\(y=0\) ...
- UVa 11354 邦德(最小瓶颈路+LCA)
https://vjudge.net/problem/UVA-11354 题意: 有n个城市m条道路,每条道路有一个危险系数.先在有若干个询问,要求找到一条从s到t的路,使得途径所有边的最大危险系数最 ...
- 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 ...
随机推荐
- alinode 配置 pm2
今天公司要配置阿里的一个node.js性能监控(alinode),这个东西看似配置很简单但是你不知道你配置对没对, 因为他需要1分钟后才能显示出来,而且模块依赖我等了10分钟才出来, 文档的链接htt ...
- vmware Selinux配置错误,导致无法启动虚拟机
Linux 开机提示kernel panic - not syncing: Attempted to kill init! 解决方法: 系统启动的时候,按下‘e’键进入grub编辑界面,编辑grub菜 ...
- ubuntu安装meshlab
ubuntu安装meshlab https://github.com/nine7nine/meshlab.git
- docker镜像存出与载入
尝试从官网上下载ubuntu镜像,太慢下载不下来. 使用daocloud加速器进行加速之后,由于公司网络不好,仍然下载不下来. 没办法,只能从别的环境上搞一个已经存在的ubuntu镜像,折腾到自己的虚 ...
- cookie与session组件
会话跟跟踪技术 cookie介绍 Djanjo中操作Cookle Session Django中Session相关方法 Django中的Session配置 CBV中加装饰器 session中运用aja ...
- clickonce发布winform必备组件
ClickOnce 发布,在系统必备中勾选了 .NET Framework 4,并选择了"从与我的应用程序相同的位置下载系统必备组件"时,执行发布,会提示缺少很多文件 使用 Pac ...
- HDU 6053 TrickGCD (莫比乌斯函数)
题意:给一个序列A,要求构造序列B,使得 Bi <= Ai, gcd(Bi) > 1, 1 <= i <= n, 输出构造的方法数. 析:首先这个题直接暴力是不可能解决的,可以 ...
- 重装ubuntu
重装前 需要备份软件.配置文件等,重装系统时,最好不要重新给/home分区,也不要格式化,要不你需要备份很多东西,重装后也需要做很多设置.也就是说/home不格式化,整个重装系统都是很快的.最多花10 ...
- HttpUploader6-queue版本更新说明
HttpUploader6-queue版本更新说明 博客园:http://www.cnblogs.com/xproer/p/5109761.html 网易博客:http://hyhyo.blog.16 ...
- js对象 1字符串对象2时间日期对象3数字对象
1字符串对象 直接对字符操作 var str = "这,是,不,是,字,符,串"; //字符串转数组 字符串.split(分隔符) var arr ...