赛艇表演 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 ...
随机推荐
- P1460 健康的荷斯坦奶牛 Healthy Holsteins (简单的dfs)
题目描述 农民JOHN以拥有世界上最健康的奶牛为傲.他知道每种饲料中所包含的牛所需的最低的维他命量是多少.请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数最少. 给出牛所需的最低的维他命 ...
- session与cookie的浅谈
cookie的用途: 当你浏览网页时,会有一些推送消息,大多数是你最近留意过的同类东西,比如你想买桌子,上淘宝搜了一下,结果连着几天会有各种各样的桌子的链接.这是因为你浏览某个网页的时候,WEB 服务 ...
- python 安装模块之pip install +模块名的换源写法
1.采用国内源,加速下载模块的速度2.常用pip源(上一篇博客介绍过):– 豆瓣:https://pypi.douban.com/simple– 阿里:https://mirrors.aliyun.c ...
- P3467(矩形覆盖问题)
描述:https://www.luogu.com.cn/problem/P3467 1.考虑如果整个建筑物链是等高的,一张高为链高,宽为整个建筑物宽的海报即可完全覆盖: 2.若有两个不等高的元素组成建 ...
- M - 昂贵的聘礼 最短路 dij
http://poj.org/problem?id=1062 这个题目有一点点特别,因为数据很小也可以用Floyd跑,但是个人比较钟爱dij. 这个dij是怎么走的呢,首先就是普通的建图,然后就是带上 ...
- 系统通配符号、系统正则符号,grep
系统通配符号.系统正则符号,grep 1 系统通配符号 系统通配符号:借助通配符号 匹配文件名称信息 1.1 *: 匹配所有(任意)字符信息 找寻以old开头的文件 find /oldboy -typ ...
- vue项目兼容ie
一.兼容ES6 Vue 的核心框架 vuejs 本身,以及官方核心插件(VueRouter.Vuex等)均可以在 ie9 上正常使用.但ie不兼容es6,所以需要安装插件将“Promise”等高级语法 ...
- 使用 Minikube 安装 Kubernetes
概述: 单机低配置主机也可以玩转kubernetes集群.该文章是将介绍使用Minikube安装Kubernetes集群(一般用于本地/开发环境). 配置环境: 硬件:CPU 至少2个核心,至少2.5 ...
- [zoj3591]Nim 游戏
题意:有n堆火柴,选择连续若干堆火柴进行Nim游戏,求让先手胜的选择方案数. 思路:让先手胜等同于这些数的异或值不同于0,不妨转化为求让先手败的方案数.此时记录一个前缀的异或和val[i],那么答案就 ...
- 在ef core中使用postgres数据库的全文检索功能实战
起源 之前做的很多项目都使用solr/elasticsearch作为全文检索引擎,它们功能全面而强大,但是对于较小的项目而言,构建和维护成本显然过高,尤其是从关系数据库/文档数据库到全文检索引擎的数据 ...