[Solution] JZOJ-5818 做运动
[Solution] JZOJ-5818 做运动
Time Limits:2000ms Memory Limits:524288KB
Description
一天,Y 君在测量体重的时候惊讶的发现,由于常年坐在电脑前认真学习,她的体重有了突 飞猛进的增长。
幸好 Y 君现在退役了,她有大量的时间来做运动,她决定每天从教学楼跑到食堂来减肥。
Y 君将学校中的所有地点编号为 1 到 n,其中她的教学楼被编号为 S,她的食堂被编号为 T, 学校中有 m 条连接两个点的双向道路,保证从任意一个点可以通过道路到达学校中的所有点。
然而 Y 君不得不面临一个严峻的问题,就是天气十分炎热,如果 Y 君太热了,她就会中暑。 于是 Y 君调查了学校中每条路的温度 t,及通过一条路所需的时间 c。Y 君在温度为 t 的地 方跑单位时间,就会使她的热量增加 t。
由于热量过高 Y 君就会中暑,而且 Y 君也希望在温度较低的路上跑,她希望在经过的所有 道路中最高温度最低的前提下,使她到达食堂时的热量最低 (从教学楼出发时,Y 君的热量为 0)。
请你帮助 Y 君设计从教学楼到食堂的路线,以满足她的要求。你只需输出你设计的路线中所 有道路的最高温度和 Y 君到达食堂时的热量。
Input
第一行由一个空格隔开的两个正整数 n, m,代表学校中的地点数和道路数。
接下来 m 行,每行由一个空格隔开的四个整数 a, b, t, c 分别代表双向道路的两个端点,温度 和通过所需时间.
最后一行由一个空格隔开的两个正整数 S, T,代表教学楼和食堂的编号。
注意:输入数据量巨大,请使用快速的读入方式。
Output
一行由一个空格隔开的两个整数,分别代表最高温度和热量。
Sample Input
5 6
1 2 1 2
2 3 2 2
3 4 3 4
4 5 3 5
1 3 4 1
3 5 3 6
1 5
Sample Output
3 24
Data Constraint
10% 的数据满足 t = 0
另外 10% 的数据满足 c = 0
另外 30% 的数据满足 n ≤ 2000
100% 的数据满足 n ≤ 5 × 10^5 , m ≤ 10^6 , 0 ≤ t ≤ 10000, 0 ≤ c ≤ 10^8 , 1 ≤ a, b, S, T ≤ n, S ≠ T
华丽的分割线
解题思路
最小生成树(图)+最短路
考场上脑抽打了个二分直接T掉,因为一次堆优化Dij就要花我一秒多
根据题目要求,我们需要先求出使起点和终点相互联通时的最小温度值,那就先对温度值进行排序再不断加边直到联通,注意:应当要将联通时温度相同的那些边也加入生成图里面,否则很显然是错误的
然后在跑一边最短路就可以了,边权是这个边的温度值乘以时间,也就是获得的热量值
可以见巨丑的代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f3f3f3f3f
#define maxn 800005
using namespace std;
struct Edge{
ll index,s,t,nxt,temp;
ll w;
}edge[maxn*4];
ll head[maxn],tot=0;
ll n,m,s,t;
ll dis[maxn],book[maxn];
priority_queue< pair<ll,ll> > hep;
void add(ll st,ll to,ll we,ll tmp){edge[tot].index=tot;edge[tot].s=st;edge[tot].t=to;edge[tot].temp=tmp;edge[tot].w=we;edge[tot].nxt=head[st];head[st]=tot;tot++;return;}
ll gmax(ll a,ll b){return a>b?a:b;}
ll gmin(ll a,ll b){return a<b?a:b;}
void check(ll tmp){
memset(dis,0x3f,sizeof(dis));
memset(book,0,sizeof(book));
while(hep.size()) hep.pop();
dis[s]=0;
hep.push(make_pair(0,s));
while(!hep.empty()){
ll np=hep.top().second;
hep.pop();
if(!book[np]){
book[np]=1;
for(ll i=head[np];i!=-1;i=edge[i].nxt){
if(edge[i].temp>tmp) continue;
if(dis[edge[i].t]>dis[np]+edge[i].w){
dis[edge[i].t]=dis[np]+edge[i].w;
hep.push(make_pair(0-dis[edge[i].t],edge[i].t));
}
}
}
}
printf("%lld %lld",tmp,dis[t]);
//anst=tmp;
//ansum=dis[t];
return;
}
bool cmp(Edge a,Edge b){return a.temp<b.temp;}
bool cmp2(Edge a,Edge b){return a.index<b.index;}
ll gf(ll x){return book[x]==x?x:book[x]=gf(book[x]);}
int main(){
freopen("running.in","r",stdin);
freopen("running.out","w",stdout);
memset(head,-1,sizeof(head));
scanf("%lld %lld",&n,&m);
//n=rd();m=rd();
for(ll i=1;i<=m;i++){
ll a,b,c,d;
scanf("%lld %lld %lld %lld",&a,&b,&c,&d);
//a=rd();b=rd();c=rd();d=rd();
add(a,b,c*d,c);
add(b,a,c*d,c);
}
scanf("%lld %lld",&s,&t);
for(ll i=1;i<=n;i++)
book[i]=i;
//s=rd();t=rd();
sort(edge,edge+tot,cmp);
ll lst=0;
for(ll i=0;i<tot;i++){
ll a=edge[i].s,b=edge[i].t;
if(gf(a)!=gf(b)){
book[gf(a)]=gf(b);
lst=edge[i].temp;
}
if(gf(s)==gf(t)){
break;
}
}
sort(edge,edge+tot,cmp2);
check(lst);
return 0;
}
[Solution] JZOJ-5818 做运动的更多相关文章
- [JZOJ 5818] 做运动
题意:带温度最短路. 思路: 我们将温度从小到大的将边加入,用并查集维护连通性. 如果一旦联通那么跑一遍\(spfa\)就可以得到答案. 复杂度\(O(m log m)\) #include < ...
- JZOJ 5818. 【NOIP提高A组模拟2018.8.15】 做运动
5818. [NOIP提高A组模拟2018.8.15] 做运动 (File IO): input:running.in output:running.out Time Limits: 2000 ms ...
- [solution] JZOJ 5459. 密室
[solution] JZOJ 5459. 密室 Description 小X 正困在一个密室里,他希望尽快逃出密室. 密室中有$N$ 个房间,初始时,小X 在1 号房间,而出口在N 号房间. 密室的 ...
- [JZOJ5818] 【NOIP提高A组模拟2018.8.15】 做运动
Description 一天,Y 君在测量体重的时候惊讶的发现,由于常年坐在电脑前认真学习,她的体重有了突 飞猛进的增长. 幸好 Y 君现在退役了,她有大量的时间来做运动,她决定每天从教学楼跑到食堂来 ...
- 刷题总结——做运动(NOIP模拟)
题目: 给定一个无向图,节点数n<=50000,m<=1000000,每条边有两个值t和c,边的长度为t*c···现在要求再t尽量小的情况下,求两节点st的最短距离 题解: 第一次做的时候 ...
- 做运动(Dijkstra+并查集+MST)
上面的题解是这样,这道题我真的脑残,其实打代码的时候就意识到了许多,可以用Dfs+Dij+二分,这样还可以卡一卡 但是我打了spfa+spfa+二分,这个显然很慢,类似的题目我好像还做过一道的,就是在 ...
- 运动规划 (Motion Planning): MoveIt! 与 OMPL
原创博文:转载请标明出处:http://www.cnblogs.com/zxouxuewei 最近有不少人询问有关MoveIt!与OMPL相关的话题,但是大部分问题都集中于XXX功能怎么实现,XXX错 ...
- 运动规划 (Motion Planning): MoveIt! 与 OMPL---44
原创博文:转载请标明出处:http://www.cnblogs.com/zxouxuewei 最近有不少人询问有关MoveIt!与OMPL相关的话题,但是大部分问题都集中于XXX功能怎么实现,XXX错 ...
- javascript运动系列第一篇——匀速运动
× 目录 [1]简单运动 [2]定时器管理 [3]分享到效果[4]移入移出[5]运动函数[6]透明度[7]多值[8]多物体[9]回调[10]函数完善[11]最终函数 前面的话 除了拖拽以外,运动也是j ...
随机推荐
- docker原理(转)
可能是把Docker的概念讲的最清楚的一篇文章 [编者的话]本文只是对Docker的概念做了较为详细的介绍,并不涉及一些像Docker环境的安装以及Docker的一些常见操作和命令. Docker是世 ...
- letecode242有效字母的异位词
bool isAnagram(char* s, char* t) { ] = {}; ] = {}; int lenS = strlen(s); int lenT = strlen(t); ;i< ...
- angluar1时间控件,在浏览器里是没有问题的,但是真机时间报错NAN
因为是老项目并且用的angluar1有时也会很头疼没法直接打包和手机联调,所以浏览器上测试的多但是真机和浏览器还是不一样的,废话不说了,看图吧 我的时间插件代码是这样的 后台返回的数据格式是这样的 , ...
- StringUtils.isEmpty StringUtils.isBlank
两个方法都是判断字符是否为空的.前者是要求没有任何字符,即str==null 或 str.length()==0:后者要求是空白字符,即无意义字符.其实isBlank判断的空字符是包括了isEmpty ...
- 《CSAPP》读书笔记
第一章 第二章 第三章 第四章 第五章 第六章 第七章 链接 可重定位目标文件 符号和符号表 符号解析 第八章 第九章 虚拟存储器 虚拟存储器 页表.页命中.缺页 地址翻译 第十章 第十一章 第十二章 ...
- 通信导论-IP数据网络基础(3)
ICMP(IP辅助协议)--网际控制报文协议 ICMP报文种类:ICMP差错报文(终点不可达.时间超过等5种)和ICMP询问报文(回送请求和回答请求.时间戳请求和回答报文2种) ICMP是一种集差错报 ...
- 100-days: twenty-four
Title: No word of a lie: scientists rate(评出) the world's biggest peddlers of bull(说瞎话的人,扯淡的人) bullsh ...
- (1)Linux常用的运维平台和工具
运维工程师使用的运维平台和工具包括: Web服务器:apache.tomcat.nginx.lighttpd 监控:nagios.ganglia.cacti.zabbix 自动部署:ansible.s ...
- c# 判断当前版本是Debugger或Release
1.第一种 (常用) #if DEBUG //debugger 环境 #else //release 环境 #endif 2. 第二种 private bool IsDebug() { Assembl ...
- 多个表左联,要返回全部的结果,解决不能用where的问题
qb.leftJoin('info_student', 'grouping_class_student.studentId', 'info_student.id'); qb.leftJoin('gro ...