传送门

不算难吧

应该有思路的

还是太水了吧

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

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

题目大意

沙漠中有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. python3 读取串口数据

    python3 读取串口数据 demo import serial import time ser = serial.Serial("COM3",115200,timeout = ...

  2. [UOJ228] 基础数据结构练习题 - 线段树

    考虑到一个数开根号 \(loglog\) 次后就会变成1,设某个Node的势能为 \(loglog(maxv-minv)\) ,那么一次根号操作会使得势能下降 \(1\) ,一次加操作最多增加 \(l ...

  3. TD - 单选框 - RadioButton

    基本方法 Html - 默认选中 //checked="true" - 默认选中 <input dojoType="bootstrap.form.RadioButt ...

  4. [Luogu]三步必杀

    Description Luogu4231 Solution 我最近到底怎么了,这种题都做不出来了,一看题第一反应李超线段树(虽然不会),觉得不可做,看一眼题解才发现这个题可以差分,然后差分还打错了好 ...

  5. 终极教程【zhong】

    just for a better future! 资源教程               aiim                   综合类 前端知识体系 前端知识结构 Web前端开发大系概览 We ...

  6. abb画学号

    MODULE Module2 VAR signaldi signaldi26; VAR signaldi signaldi37; VAR signaldi signaldi48; PROC main2 ...

  7. git 卡住推不上去

    luoxu@lenovo:~/testGit/.git$ env | grep -i proxy 查看有没有设置代理 ALL_PROXY=socks://127.0.0.1:1080/ no_prox ...

  8. Python 分发包中添加额外文件【新手必学】

      在制作一个 Python 分发包时经常需要把一些文件添加到包中.最常见的例子是你希望通过 pip install命令安装 Python 包时会在 /etc/ 等目录下自动添加默认配置文件,由此可以 ...

  9. PHP 源码 — intval 函数源码分析

    PHP 源码 - intval 函数源码分析 文章来源: https://github.com/suhanyujie/learn-computer/ 作者:suhanyujie 基于PHP 7.3.3 ...

  10. 每天进步一点点------Allegro 群组布线

    执行Route->connect命令,设置好控制面板中的内容.然后设置同时走线的GROUP包含哪些网络,有两种方法.第一种方法,如果几个网络是紧邻的,可以直接框选,选中的网络就会被包含在GROU ...