[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 做运动的更多相关文章

  1. [JZOJ 5818] 做运动

    题意:带温度最短路. 思路: 我们将温度从小到大的将边加入,用并查集维护连通性. 如果一旦联通那么跑一遍\(spfa\)就可以得到答案. 复杂度\(O(m log m)\) #include < ...

  2. 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  ...

  3. [solution] JZOJ 5459. 密室

    [solution] JZOJ 5459. 密室 Description 小X 正困在一个密室里,他希望尽快逃出密室. 密室中有$N$ 个房间,初始时,小X 在1 号房间,而出口在N 号房间. 密室的 ...

  4. [JZOJ5818] 【NOIP提高A组模拟2018.8.15】 做运动

    Description 一天,Y 君在测量体重的时候惊讶的发现,由于常年坐在电脑前认真学习,她的体重有了突 飞猛进的增长. 幸好 Y 君现在退役了,她有大量的时间来做运动,她决定每天从教学楼跑到食堂来 ...

  5. 刷题总结——做运动(NOIP模拟)

    题目: 给定一个无向图,节点数n<=50000,m<=1000000,每条边有两个值t和c,边的长度为t*c···现在要求再t尽量小的情况下,求两节点st的最短距离 题解: 第一次做的时候 ...

  6. 做运动(Dijkstra+并查集+MST)

    上面的题解是这样,这道题我真的脑残,其实打代码的时候就意识到了许多,可以用Dfs+Dij+二分,这样还可以卡一卡 但是我打了spfa+spfa+二分,这个显然很慢,类似的题目我好像还做过一道的,就是在 ...

  7. 运动规划 (Motion Planning): MoveIt! 与 OMPL

    原创博文:转载请标明出处:http://www.cnblogs.com/zxouxuewei 最近有不少人询问有关MoveIt!与OMPL相关的话题,但是大部分问题都集中于XXX功能怎么实现,XXX错 ...

  8. 运动规划 (Motion Planning): MoveIt! 与 OMPL---44

    原创博文:转载请标明出处:http://www.cnblogs.com/zxouxuewei 最近有不少人询问有关MoveIt!与OMPL相关的话题,但是大部分问题都集中于XXX功能怎么实现,XXX错 ...

  9. javascript运动系列第一篇——匀速运动

    × 目录 [1]简单运动 [2]定时器管理 [3]分享到效果[4]移入移出[5]运动函数[6]透明度[7]多值[8]多物体[9]回调[10]函数完善[11]最终函数 前面的话 除了拖拽以外,运动也是j ...

随机推荐

  1. ES中的分词器

    基本概念: 全文搜索引擎会用某种算法对要建索引的文档进行分析, 从文档中提取出若干Token(词元), 这些算法称为Tokenizer(分词器), 这些Token会被进一步处理, 比如转成小写等, 这 ...

  2. 导出文件的时候 加大php内存

    ini_set('max_execution_time', 3600); ini_set('memory_limit', '2048M');

  3. spring 自定参数解析器(HandlerMethodArgumentResolver)

    https://blog.csdn.net/u010187242/article/details/73647670

  4. docker容器composer 部署 laravel框架

    首先yum install docker     安装docker service docker start   启动docker docker pull  docker.io/skiychan/ng ...

  5. 不常用但是很实用的css记录

    本文主旨是记录一些不常用但是非常炫酷的css属性,提升用户体验的捷径之一. 1.background-attachment  滚动视差    https://codepen.io/Chokcoco/p ...

  6. 如何解决出现AXIOS的跨域问题:Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.

    转载:https://www.cnblogs.com/caimuqing/p/6733405.html 问题描述: 由于restful接口需要在头部header传递两个字段: Content-Type ...

  7. Chapter_4_JAVA作业

    一.类的封装,继承与多态 1.课前预习 1.1 举列现实生活中的封装,以及简述在程序中什么是属性的封装? 1.1.1 将东西捆绑在一起,如集成芯片:高压电线等等 1.1.2 封装就是将属性私有化,提供 ...

  8. NOIP2018游记-退役之战

    \(Day\ 0\) 从火车站下来坐地铁\(1\)小时,再乘公交车到酒店,还要帮队里一个断腿大佬搬东西,累死我了.. 到酒店就快\(5\)点了,想打个牌也没时间. 酒店的房间很不错,空间大又干净,后来 ...

  9. FPGA學習筆記(肆)--- Star Test Bench Template Writer

    上一篇testbench我自己也沒怎麽搞懂,再來一篇學習特權同學的方法. 課程:Lesson 7 BJ EPM240学习板实验1——分频计数实验 鏈接:https://www.youtube.com/ ...

  10. 博客1--tensorflow的图像基本处理操作

    话不多,具体内容在开源中国里我的博客:https://my.oschina.net/u/3770644 代码: #!/usr/bin/env python# -*- coding:utf-8 -*-# ...