传送门

不算难吧

应该有思路的

还是太水了吧

(而且和货车运输很像的啊

----------------------------------------------------------------------------------------

题目大意

沙漠中有n 个绿洲(编号为1−n )和e 条连接绿洲的双向道路。每条道路都有一个长度d 和一个温度值r 。给定起点绿洲编号sss 和终点绿洲编号ttt ,求出一条sss 到ttt 的路径,使得这条路径上经过的所有道路的最高温度尽量小,如果有多条路径,选择总长度最短的那一条。

输入格式

输入包含多组数据。

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

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

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

输出格式

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

----------------------------------------------------------------------------------------

如果只考虑最小的最大热度

那么本题就是一个最小瓶颈路问题

只需按照热度找一棵最小生成树即可。

但是,如果这样的路径有多个,

实际上是最小生成树有多个时,

要找到最短路径,

还得把热度不大于最小生成树中最大热度的边并且没在生成树中的边加到最小生成树中,

然后再找最短路。

#include<cstdio>
#include<cctype>
#include<algorithm>
#include<cstring>
#include<queue>
#include<vector>
#define INF 0x3f3f3f3f
using namespace std; inline int read()
{
int sum = ,p = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-')
p = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
(sum *= ) += ch - '';
ch = getchar();
}
return sum * p;
} const int maxm = ;
int n,m,s,t;
double tmp;
struct edge
{
int x,y;
double d,r;
} e[maxm];
int fa[];
struct edgee
{
int nxt,to;
double wei;
} ed[maxm * ];
int cnt,head[];
double dis[];
struct node
{
int u;
double d;
friend bool operator < (const node &a,const node &b)
{
return a.d > b.d;
}
};
priority_queue<node> q;
bool mrk[];
vector<int> path; bool cmp(edge a,edge b)
{
return a.r < b.r;
}
int findfa(int o)
{
if(o == fa[o]) return o;
else return fa[o] = findfa(fa[o]);
} void kruskal()
{
for(int i = ; i <= n; i++)
fa[i] = i;
sort(e+,e+m+,cmp);
for(int i = ; i <= m; i++)
{
int u = findfa(e[i].x);
int v = findfa(e[i].y);
if(u == v)
continue;
fa[u] = v;
tmp = max(tmp,e[i].r);
if(findfa(s) == findfa(t))
break;
}
} void add(int a,int b,double c)
{
ed[++cnt].nxt = head[a];
ed[cnt].to = b;
ed[cnt].wei = c;
head[a] = cnt;
} void dijkstra()
{
for(int i = ; i <= m; i++)
{
if(e[i].r > tmp)
break;
add(e[i].x,e[i].y,e[i].d);
add(e[i].y,e[i].x,e[i].d);
}
for(int i = ;i <= n;i++)
dis[i] = INF,fa[i] = ,mrk[i] = ;
dis[s] = ;
q.push((node){s,dis[s]});
while(q.size())
{
int u = q.top().u;
q.pop();
if(mrk[u])
continue;
mrk[u] = true;
for(int i = head[u]; i; i = ed[i].nxt)
{
int v = ed[i].to;
double z = ed[i].wei;
if(dis[v] > dis[u] + z)
{
dis[v] = dis[u] + z;
fa[v] = u;
q.push((node){v,dis[v]});
}
}
}
int x = t;
path.clear();
while(x != s)
{
path.push_back(x);
x = fa[x];
}
path.push_back(s);
for(int i = path.size()-;i >= ;i--)
printf("%d ",path[i]);
printf("%d\n",path[]);
} void pre()
{
cnt = ,tmp = ;
memset(e,,sizeof(e));
memset(ed,,sizeof(ed));
memset(mrk,,sizeof(mrk));
memset(head,,sizeof(head));
memset(fa,,sizeof(fa));
} int main()
{
while(~scanf("%d%d",&n,&m))
{
pre();
s = read(),t = read();
for(int i = ; i <= m; i++)
{
e[i].x = read(),e[i].y = read();
scanf("%lf%lf",&e[i].r,&e[i].d);
}
kruskal();
dijkstra();
printf("%.1lf %.1lf\n",dis[t],tmp);
}
return ;
}

注意:

题目稍稍有点坑

一定是先读入温度再读入长度

有几处double 打成 int

忽略了n 和 m

两个结构体的名搞混了

最最最坑:::对换行符和空格的输出特别严格qwq(这谁抗的住w

(sdqxt莫得未来

Travel in desert的更多相关文章

  1. 【UVA10816】Travel in Desert (最小瓶颈路+最短路)

    UVA10816 Travel in Desert 题目大意 沙漠中有一些道路,每个道路有一个温度和距离,要求s,t两点间的一条路径,满足温度最大值最小,并且长度最短 输入格式 输入包含多组数据. 每 ...

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

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

  3. uva 10816 Travel in Desert(简单的好题~两种方法)

    题意: 给出 一个图 点与点之间的路径上有两个权值 路径长度和温度 要求在所走路径中的温度的最大值最小的前提下 走最短路径 解题思路1: 首先用 最小生成树 的方法走出 最小瓶颈路 .把在这期间用到的 ...

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

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

  5. 图论 - Travel

    Travel The country frog lives in has nn towns which are conveniently numbered by 1,2,…,n. Among n(n− ...

  6. 【BZOJ-1576】安全路径Travel Dijkstra + 并查集

    1576: [Usaco2009 Jan]安全路经Travel Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1044  Solved: 363[Sub ...

  7. Linux inode && Fast Directory Travel Method(undone)

    目录 . Linux inode简介 . Fast Directory Travel Method 1. Linux inode简介 0x1: 磁盘分割原理 字节 -> 扇区(sector)(每 ...

  8. HDU - Travel

    Problem Description Jack likes to travel around the world, but he doesn’t like to wait. Now, he is t ...

  9. 2015弱校联盟(1) - I. Travel

    I. Travel Time Limit: 3000ms Memory Limit: 65536KB The country frog lives in has n towns which are c ...

随机推荐

  1. 在用vue-cli4创建的vue2.x项目中通过vue-fontawesome使用fontawesome5

    前言 本文写于2020年1月11日,仅提供最基本的引用方法,参考fontawesome5英文官方文档和vue-fontawesome英文官方文档. 正文 在vue项目中使用fontawesome5图标 ...

  2. python3函数的参数

    函数的定义能简化代码的逻辑,对于函数的调用者来说,只需要知道如何正确的传递参数,以及知道函数将返回什么值就可以了,而函数内部的复杂逻辑被封装起来,调用者不必了解. 位置参数 调用函数时,传入实参的值按 ...

  3. 洛谷P1068 分数线划定

    https://www.luogu.org/problem/P1068 #include<bits/stdc++.h> using namespace std; struct Can { ...

  4. 己亥清爽恢复系列之数据文件1篇:SYSTEM物理损坏或丢失(关键表空间)

    己亥清爽系列说明:清爽系列是作为恢复系列的基础篇,基于FS(File System)文件系统的手工还原恢复,也叫基于用户管理的还原恢复.来自于博客园AskScuti 实验说明:在有完全备份基础下,物理 ...

  5. 【转载】Hive vs HBase

    转自:http://www.chinastor.com/a/hbase/0G3Z532014.html Hive是什么? Apache Hive是一个构建于Hadoop(分布式系统基础架构)顶层的数据 ...

  6. Docker - docker images存储位置,引出ls和du命令的不同

    docker镜像存储位置 docker info | grep "Docker Root Dir" 例如我的driver是overlay2,则docker镜像的实际存储在/var/ ...

  7. Linux平台下C++使用JsonCPP解析Json字符串

    JsonCPP安装 安装 scons 下载地址: http://sourceforge.net/projects/scons/files/scons/2.1.0/scons-2.1.0.tar.gz/ ...

  8. SQL Server中使用msdb数据库的存储过程sp_delete_backuphistory和sp_delete_database_backuphistory来删除备份和恢复历史数据

    根据微软文档对sp_delete_backuphistory存储过程的介绍,SQL Server在每次备份和恢复数据库后,会向msdb系统数据库的备份和恢复历史表写入数据,如果SQL Server经常 ...

  9. 【转载】Java泛型(二)

    转自:http://www.cnblogs.com/lwbqqyumidi/p/3837629.html 一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public ...

  10. mysql yum 卸载取消开机自启动

    查询安装的yum源rpm -qa | grep -i mysql 使用yum remove卸载 yum remove 刚才过滤出来的包一个个来 剩下卸载不了使用 rpm -e --nodeps: rp ...