codeforces 938D Buy a Ticket 有初值的Dijkstra、有趣的题目

题意

给出一些城市电影票的价格,以及城市之间交通的路费,询问每一个城市怎样才能花最少的钱看到电影(看完电影还要再回来)。

题解

这是一道不太难但是挺有趣的题目。
我们这样想,每个城市只需要查看票价比他更便宜的城市,来更新本城市的票价就可以了,是不是想到了Dijkstra求最短路的思路。
这样的话,我们先从票价最便宜的城市开始,从这个城市出发,更新其他所有城市的票价(新票价=原票价+2*路费),然后本城市的票价就求出来了。
再重复上述操作,也就是重新找一个票价最低的城市,然后更新其他城市的票价,这样就ok啦。

这道题还有一个巨坑,会卡掉一部分人的Dijkstra的代码,比如我,TLE。
为什么呢?
很多人写代码像这样

	while(!pq.empty()){pair<ll,int> p = pq.top();pq.pop();int u = p.second;for(int e = head[u];e != -1;e = es[e].nxt){int v = es[e].v;ll w = es[e].w;if(wa[v] > 2*w+wa[u]){wa[v] = wa[u]+2*w;pq.push(make_pair(wa[v],v));}}}

这样写过不了第18组测试数据,因为这样一组极端数据就卡掉了
n = 200000,m = 199999
200000 1 2
200000 2 4
200000 3 6
200000 4 8

假如优先队列运行时访问点的顺序是1、2、3、…、200000
那么优先队列里面会有199999个(dist[200000],200000)点对。
而每有一个这样的点对,都将会把200000的边全都遍历一边。
时间复杂度就会增加到2000002200000^22000002显然爆炸,所以要把优先队列里面多余点对删掉。
在u点被取出时,增加一句。
if(wa[u] < p.first) continue;
至此,这道题就AC啦。


####代码

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
typedef long long ll;
typedef pair<ll,int> pli;
const int maxn = 2e5+10;
priority_queue<pli,vector<pli>,greater<pli> > pq;
ll wa[maxn];
struct edge{int u,v,nxt;ll w;
}es[maxn<<1];
int head[maxn],vis[maxn];
int cnt = 0,n,m;
void addedge(int u,int v,ll w){es[cnt].u = u,es[cnt].v = v,es[cnt].nxt = head[u],es[cnt].w = w;head[u] = cnt++;
}
void solve(){while(!pq.empty()){pair<ll,int> p = pq.top();pq.pop();int u = p.second;if(wa[u] < p.first) continue;for(int e = head[u];e != -1;e = es[e].nxt){int v = es[e].v;ll w = es[e].w;if(wa[v] > 2*w+wa[u]){wa[v] = wa[u]+2*w;pq.push(make_pair(wa[v],v));}}}
}
int main(){memset(head,-1,sizeof(head));cin>>n>>m;for(int i = 0;i < m;++i){int u,v;ll w;scanf("%d%d%lld",&u,&v,&w);addedge(u,v,w);addedge(v,u,w);}for(int i = 1;i <= n;++i) {ll w;scanf("%lld",&w);wa[i] = w;pq.push(make_pair(w,i));}solve();for(int i = 1;i <= n;++i)printf("%lld ",wa[i]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P2480-[SDOI2010]古代猪文【中国剩余定理,Lucas定理】

大早上起来写题有助于醒脑&#xff08;其实是昨晚没睡好/kk 正题 题目链接:https://www.luogu.com.cn/problem/P2480 题目大意 给出nnn和ggg&#xff0c;求g∑d∣nCnd%999911659g^{\sum_{d|n}C_{n}^d}\% 999911659g∑d∣n​Cnd​%999911659 解题思路 因为999911659999911659…

qMISPlat入门级使用问题解答一

qMISPlat 2.0(业务配置开发平台) 自2018-4-18号正式开源以来&#xff0c;得到了众多.net core爱好者的关注&#xff0c;现将近半个月以来&#xff0c;大家反馈的一些使用配置方面的问题统一作如下解答。如你对qMISPlat不了解&#xff0c;请查看文章qMISPlat产品介绍。一、从码云…

【DP】小明游天界(zjoj 2149)

小明游天界 题目大意&#xff1a; 有 m个单位时间&#xff0c;让你从1走到n&#xff08;不能早到&#xff0c;不能晚到&#xff09;&#xff0c;要使经过的城市最多&#xff0c;若无法用m个单位时间到达n就输出-1 样例输入 5 12 4 1 2 5 1 4 3 4 2 4 2 5 5 样例输出 …

codeforces 935E Fafa and Ancient Mathematics 语法树、动态规划

题解 一道很有意思的题目&#xff0c;同时把动态规划和语法树结合起来&#xff0c;很有新意&#xff0c;思路我是想出来了&#xff0c;但是我的写法较为麻烦&#xff0c;从别人的submission中找了一个写起来简介的代码分享给大家。 看到表达式的形式&#xff0c;我们可以想到使…

P1429-平面最近点对(加强版)【分治】

正题 题目链接:https://www.luogu.com.cn/problem/P1429 题目大意 平面上nnn个点&#xff0c;求最近点对 解题思路 考虑分治求最近点对&#xff0c;首先将平行于yyy轴将平面穿过xxx左边的中位数分割成两半&#xff0c;现在最近点对有三种可能&#xff0c; 在分割线左边在分…

夏季(8 ~9)月 在深圳举办线下dotnet 大会 调查

随着微软 Build 2018的落幕&#xff0c;微软为.NET Core的应用规划了七大场景&#xff1a;计划今年夏季&#xff08;8 ~9&#xff09;月 在深圳举办线下dotnet 大会 &#xff0c;特此向大家做个调查。请大家抽出5分钟做下投票&#xff1a;顺便送大家一个福利&#xff1a;.NET社…

2019.01.22【NOIP普及组】模拟赛C组总结

总结 这次模拟赛拿到了10010010060360的分数 第1,2题不怎么难&#xff0c;快速解决&#xff0c;第3题看到之后马上想到了混合背包&#xff0c;打了大概半小时解决了&#xff0c;最后一道题想来想去&#xff0c;想了一堆没用的东西&#xff0c;最后打了一个垃圾DP拿了60分&…

codeforces 938E MaxHistory 组合数学

题意 给出一个长为n的序列&#xff0c;对于这个序列的任意一个排列&#xff0c;求∑fa\sum f_a∑fa​的值。 题解 我们枚举每一个aia_iai​然后&#xff0c;计算aia_iai​出现了多少次&#xff0c;然后把ai∗numa_i*numai​∗num加入到ans里面。 考虑aia_iai​什么时候出现。 a…

.NET 图形化开源爬虫Hawk 3发布

超级图形化爬虫Hawk已经发布两年半时间了&#xff0c;2015年升级到第二版&#xff0c;收到上千条用户反馈(tucao)&#xff0c;100多个红包&#xff0c;总共666块五毛~一直想攒着这笔钱&#xff0c;去北境之王天通苑的龙德商场买最心爱的阿迪王&#xff01;啥&#xff0c;你不知…

P4027-[NOI2007]货币兑换【斜率优化dp,CDQ分治】

正题 题目链接:https://www.luogu.com.cn/problem/P4027 题目大意 nnn天开始时有SSS元钱&#xff0c;每天AAA种股票价格为aia_iai​,BBB种价格为bib_ibi​。然后出售必须AAA和BBB出售相同比例&#xff0c;买入时AAA和BBB必须按照rir_iri​的比例买入。 求最后的钱最多是多少 …

【栈】【字符】匹配(jzoj 1612)

匹配 题目大意&#xff1a; 给你一个长度为n的字符串&#xff08;有多组数据&#xff09;&#xff0c;中间有小写字母&#xff08;没用的东西&#xff09;和大写字母&#xff0c;A-M是左括号&#xff0c;与之相对的是右括号Z-N&#xff08;之所以说是Z-N而不是N-Z是因为只有Z…

codeforces 940E Cashback 有趣的dp

题解 这么明显的一个dp&#xff0c;我怎么就没看出来呢&#xff1f;&#xff01; 首先我们需要一些前提条件&#xff1a;任何划分出来的一个区间的长度不应该超过c。 如果这个区间长度大于c&#xff0c;那么设lenn∗cklenn∗ck&#xff0c;那么这个区间应该被分成n个长度为c的…

理解 C# 项目 csproj 文件格式的本质和编译流程

写了这么多个 C# 项目&#xff0c;是否对项目文件 csproj 有一些了解呢&#xff1f;Visual Studio 是怎么让 csproj 中的内容正确显示出来的呢&#xff1f;更深入的&#xff0c;我能够自己扩展 csproj 的功能吗&#xff1f;本文将直接从 csproj 文件格式的本质来看以上这些问题…

P2000-拯救世界【生成函数,NTT】

正题 题目链接:https://www.luogu.com.cn/problem/P2000 题目大意 十种东西&#xff0c;有要求 金神石A的块数必须是 6 的倍数。 木神石A最多用 9 块。 水神石A最多用 5 块。 火神石A的块数必须是 4 的倍数。 土神石A最多用 7 块。 金神石B的块数必须是 2 的倍数。 木神石B最…

【模拟】生日蛋糕(jzoj 1613)

生日蛋糕 题目大意&#xff1a; 一个正方形蛋糕&#xff0c;竖着横着各切一刀&#xff0c;使他变成四块正方形蛋糕&#xff0c;蛋糕中有一些巧克力&#xff0c;而小明只能拿巧克力最少的一块&#xff0c;请问小明要怎么切才能吃到最多的巧克力 样例输入 8 …#…#… .##……

使用.NET Core与Google Optimization Tools实现加工车间任务规划

前一篇文章《使用.NET Core与Google Optimization Tools实现员工排班计划Scheduling》算是一种针对内容的规划&#xff0c;而针对时间顺序任务规划&#xff0c;加工车间的工活儿是一个典型的场景。在加工车间有不同的工活儿&#xff0c;一般称为作业&#xff0c;每种作业都有多…

P6047-丝之割【斜率优化,dp】

前言 然而丝之鸽还是没有出 正题 题目链接:https://www.luogu.com.cn/problem/P6047 题目大意 两个平行的线&#xff0c;上面连接着若干条弦&#xff0c;第iii条连接上方的xix_ixi​个下方的yiy_iyi​。 然后每次可以选择一个位置(i,j)(i,j)(i,j)&#xff0c;可以切断任何位…

洛谷P1373 小a和uim之大逃离 动态规划

题解 我们可以先简单的想一种状态&#xff0c;也就是dp[i][j][x][y][t]dp[i][j][x][y][t]dp[i][j][x][y][t]&#xff0c;这是最暴力的。 当t0t 0t0时&#xff0c;表示小a处于(i,j)(i,j)(i,j)位置&#xff0c;其中小a拥有x魔液&#xff0c;uim拥有y的魔液时候的方案总数。t1t …

【模拟】游戏(jzoj 1614)

游戏 题目大意&#xff1a; 有一个n*n的棋盘&#xff0c;有一个坐标在x,y的棋子&#xff0c; 1、2号玩家可以将他向左&#xff0c;向下&#xff0c;向左下&#xff08;45∘45^{\circ}45∘&#xff09;移动若干格&#xff0c;假如他们都是AKIOI聪明绝顶的巨佬&#xff0c;请问…

VSTS + XX云服务器构建netcore+docker持续集成交付部署

持续集成交付部署是什么意思,它给我们带来什么好处&#xff1f;先贴一张图持续集成&#xff08;Continuous Integration&#xff09;持续集成强调开发人员提交了新代码之后&#xff0c;立刻进行构建、&#xff08;单元&#xff09;测试(这个要看情况了是否需要)持续交付&#x…