[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. react-redux的使用

    在react-redux 框架中,给我提供了两个常用的API来配合Redux框架的使用,其实在我们的实际项目开发中,我们完全可以不用react-redux框架,但是如果使用此框架,就如虎添翼了. 我们 ...

  2. 《Go程序设计语言》读书笔记-函数

    函数包含连续执行的语句,可以使用代码中通过调用函数来执行他们,函数能够将一个复杂的工作切分成多个更小的模块,使多人写作变得容易.另外,函数对他的使用者隐藏了实现细节.这几方面的特性使得函数成为多数编程 ...

  3. spring boot 1.x配置,不断完善中

    spring boot是典型的约定大于配置,那么很有必要对在开发过程中这些配置做统一的添加记录,以免用到的时候到处搜索,网上的东西又良莠不齐. server.port=8880 微服务注册中心,yml ...

  4. jquery-confirm使用方法

    简要教程 jquery-confirm是一款功能强大的jQuery对话框和确认框插件.它提供多种内置的主题效果,可以实现ajax远程加载内容,提供动画效果和丰富的配置参数等.它的特点还有: 可以使用键 ...

  5. 使用vue-cli@3启动elementui脚手架

    [vue3.x] 准备看elementui的源码,早上拉elementui提供的脚手架代码,于是下载了vue3.x(之前一直用2.x) 1.先把vue2.x卸载了 npm uninstall -g v ...

  6. SPA

    为什么用SPA 1. 减少服务器压力  如果不用spa  那么每次切换页面的时候,就会向服务器发送一个请求 服务器返回一个html文件   如果使用了SPA  在切换时,不需要请求服务器,只要通过本地 ...

  7. spring 装配机制

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w ...

  8. lodash 判断一个数据是否包含另一个数组

    if (_.intersection(v.ids, value).length == value.length) { this.groupListExtData.push(v.names); }   ...

  9. error: command 'gcc' failed with exit status 1

    MacOS下想安装MySQL-Python,执行语句: sudo pip install MySQL-Python 遇到了如下错误信息: /Users/kaitlyn/anaconda3/envs/e ...

  10. hbase-bloom filter

    bloom fliter的作用主要用于提升hbase的读性能,但是会牺牲一定的存储空间. 原理: bloom fliter是一种空间效率很高的随机数据结构,初始状态时,bloom filter是一个包 ...