赛艇表演 51nod提高组模拟试题
题目描述
小明去某个地区观看赛艇比赛,这个地区共有n个城市和m条道路,每个城市都有赛艇比赛,在第i个 城市观看赛艇表演的价钱为ai, 去其他城市观看也需要支付赛艇表演的价格。任意两个城市之间通过 一条公路连接,并且道路是双向通行的, 观看赛艇比赛时经过的每一条道路都要支付一定的过路费, 观看完比赛返回家时经过的每一条道路也要支付过路费。 对于每个城市u,你需要为小明确定一个城市v,使得从u出发,前往v看赛艇表演,再从v回到u,u可 以等于v,要求花费的总金额尽量的少。请根据题目给出的数据输出总金额。
输入格式
第一行两个正整数n和m。 接下来m行,每行三个正整数u,v,w,表示有一条双向道路连接u和v,且每经过一次的过路费是 w。 接下来一行n个数,第i个数表示在第i个城市观看赛艇表演的价钱。
输出格式
输出一行n个数,第i个数表示从第i个城市出发至少要花多少钱
数据范围
对于前30%的数据,n<=10,m<=20。 对于前50%的数据,n<=100,m<=500。 对于前70%的数据,n<=1500,m<=2000。 对于前85%的数据,图的结构以某种方式随机生成。 对于100%的数据,n<=2e5,m<=2e5,过路费和门票钱都在[1,1e12]内。
输入样例
4 2
1 2 4
2 3 7
6 20 1 25
输出样例
6 14 1 25
一道十分有趣的题。首先的思路肯定是对于每个城市,枚举终点,并求出其对应的最短路。
然而,毫无疑问,这样的结果便是一片TLE。
这道题最棘手的一点,便是每个点本身的price 和 路径的w均会对结果造成影响。
而这也导致我们不能直接使用最短路算法求出路径w最小。
考虑一种方法,使得price和w可以同时被考虑。
而且原题已经明确的给出了我们一张图,也要尽量利用这张图。
想出一种建图方法:
设立一个超级源点S,将其和所有的点之间连边,大小为price,然后从其跑最短路。最短路得到的dis即为每个点的答案。
而点与点之间的路径,完全可以直接设为2w,不用真的跑来回。这样,我们就直接考虑了price和w。
可以看一下对应操作: 对于下图三号点,从s直接到3即为在原地观看,从s -> 1 -> 3即为从3点去1点观看。
(惊叹,斜视,默坐,以为绝妙)
千少万少,代码不能少
#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define ll long long inline ll read(){
ll x = , s = ;
char c = getchar();
while(!isdigit(c)){
if(c == '-')s = -;
c = getchar();
}
while(isdigit(c)){
x = (x << ) + (x << ) + (c ^ '');
c = getchar();
}
return x * s;
} ll n, m;
struct hehe{
ll u, v, w;
ll next;
}t[N];
ll f[N]; struct node{
ll now, dis;
bool operator < (const node& a) const{
return dis > a.dis;
}
}; ll d[N];
bool vis[N];
priority_queue <node> q; ll bian = ;
inline void add(ll u, ll v, ll w){
t[++bian].u = u;
t[bian].v = v;
t[bian].w = w;
t[bian].next = f[u];
f[u] = bian;
return ;
} void dijstra(ll s){
memset(d, , sizeof(d));
q.push((node){s,});
d[s] = ;
while(!q.empty()){
node temp = q.top();
q.pop();
ll now = temp.now, dis = temp.dis;
if(!vis[now]){
vis[now] = ;
for(int i = f[now];i;i = t[i].next){
ll v = t[i].v, w = t[i].w, u = t[i].u;
if(d[v] > d[u] + w){
d[v] = d[u] + w;
if(!vis[v]) q.push((node) {v, d[v]});
}
}
}
}
return ;
} int main(){
n = read(), m = read();
for(int i = ;i <= m; i++){
ll x = read(), y = read(), w = read();
add(x, y, w << );add(y, x, w << );
}
for(int i = ;i <= n; i++){
ll x = read();
add(, i, x);
add(i, , x);
}
dijstra();
for(int i = ;i <= n; i++)
printf("%d ",d[i]);
return ;
}
赛艇表演 51nod提高组模拟试题的更多相关文章
- 计蒜客 NOIP 提高组模拟竞赛第一试 补记
计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...
- JZOJ 5196. 【NOIP2017提高组模拟7.3】B
5196. [NOIP2017提高组模拟7.3]B Time Limits: 1000 ms Memory Limits: 262144 KB Detailed Limits Goto Pro ...
- JZOJ 5197. 【NOIP2017提高组模拟7.3】C
5197. [NOIP2017提高组模拟7.3]C Time Limits: 1000 ms Memory Limits: 262144 KB Detailed Limits Goto Pro ...
- JZOJ 5195. 【NOIP2017提高组模拟7.3】A
5195. [NOIP2017提高组模拟7.3]A Time Limits: 1000 ms Memory Limits: 262144 KB Detailed Limits Goto Pro ...
- JZOJ 5184. 【NOIP2017提高组模拟6.29】Gift
5184. [NOIP2017提高组模拟6.29]Gift (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Detailed ...
- JZOJ 5185. 【NOIP2017提高组模拟6.30】tty's sequence
5185. [NOIP2017提高组模拟6.30]tty's sequence (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB ...
- ZROI提高组模拟赛05总结
ZROI提高组模拟赛05总结 感觉是目前为止最简单的模拟赛了吧 但是依旧不尽人意... T1 有一半的人在30min前就A掉了 而我花了1h11min 就是一个简单的背包,我硬是转化了模型想了好久,生 ...
- NOIP2017提高组 模拟赛15(总结)
NOIP2017提高组 模拟赛15(总结) 第一题 讨厌整除的小明 [题目描述] 小明作为一个数学迷,总会出于数字的一些性质喜欢上某个数字,然而当他喜欢数字k的时候,却十分讨厌那些能够整除k而比k小的 ...
- NOIP2017提高组 模拟赛13(总结)
NOIP2017提高组 模拟赛13(总结) 第一题 函数 [题目描述] [输入格式] 三个整数. 1≤t<10^9+7,2≤l≤r≤5*10^6 [输出格式] 一个整数. [输出样例] 2 2 ...
随机推荐
- 数学--数论--POJ1365——Prime Land
Description Everybody in the Prime Land is using a prime base number system. In this system, each po ...
- Codeforce 1255 Round #601 (Div. 2) A. Changing Volume (贪心)
Bob watches TV every day. He always sets the volume of his TV to bb. However, today he is angry to f ...
- 轻量化模型:MobileNet v2
MobileNet v2 论文链接:https://arxiv.org/abs/1801.04381 MobileNet v2是对MobileNet v1的改进,也是一个轻量化模型. 关于Mobile ...
- 一文带你学会java的jvm精华知识点
前言 本文分为20多个问题,通过问题的方式,来逐渐理解jvm,由浅及深.希望帮助到大家. 1. Java类实例化时,JVM执行顺序? 正确的顺序如下: 1父类静态代码块 2父类静态变量 3子类静态代码 ...
- Pandas切片操作:很容易忽视的SettingWithCopyWarning
Pandas是一个强大的分析结构化数据的工具集,主要用于数据挖掘和数据分析,同时也提供数据清洗功能. 很多初学者在数据的选取,修改和切片时经常面临一些困惑.这是因为Pandas提供了太多方法可以做同样 ...
- Python高级编程-Python一切皆对象
Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 ""&qu ...
- B. Sorted Adjacent Differences(思维构造)
\(给出n个数字,要求构造一个由这n个数组成的序列,使得|a_1-a_2|<=|a_2-a_3|...<=|a_{n-1}-a_n|\) \(排序后,从数列中间取个数,然后从左右分别循环取 ...
- sshd: no hostkeys available — exiting
在开启SSHD服务时报错.sshd re-exec requires execution with an absolute path用绝对路径启动,也报错如下:Could not load host ...
- [hdu5418 Victor and World]floyd + 状压DP 或 SPFA
题意:给n个点,m条边,每次只能沿边走,花费为边权值,求从1出发经过所有其它点≥1次最后回到1的最小花费. 思路: 状压DP.先用Floyd得到任意两点间的最短距离,转移时沿两个点的最短路转移.此时的 ...
- jstree 反选,测试400条数据左右有点卡
$("#reversecheckallmachines").on("change", function () { var checkedNodes = []; ...