bzoj 2259 [Oibh] 新型计算机 —— 最短路
发布日期:2021-08-19 19:59:31 浏览次数:7 分类:技术文章

本文共 1259 字,大约阅读时间需要 4 分钟。

题目:

相邻点之间连边权为1的边,就是水最短路了;

要注意点上的数不能改成负数,但是想一想改成负数还不如一开始就不走到这个点,所以这个不必担心;

注意1号点到2号点不能连边权为1的边,因为实际上不能直接走过去。

代码如下:

#include
#include
#include
#include
#include
using namespace std;typedef long long ll;int const xn=1e6+5;int n,hd[xn],ct,to[xn*3],nxt[xn*3],w[xn*3];ll dis[xn];bool vis[xn];struct N{ ll d; int id; bool operator < (const N &y) const {
return d>y.d;}};priority_queue
q;int rd(){ int ret=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')f=0; ch=getchar();} while(ch>='0'&&ch<='9')ret=(ret<<3)+(ret<<1)+ch-'0',ch=getchar(); return f?ret:-ret;}void add(int x,int y,int z){to[++ct]=y; nxt[ct]=hd[x]; w[ct]=z; hd[x]=ct;}void dij(){ memset(dis,0x3f,sizeof dis); dis[1]=0; q.push((N){ 0,1}); while(q.size()) { int x=q.top().id; q.pop(); if(vis[x])continue; vis[x]=1; for(int i=hd[x],u;i;i=nxt[i]) if(dis[u=to[i]]>dis[x]+w[i]) dis[u]=dis[x]+w[i],q.push((N){dis[u],u}); }}int main(){ n=rd(); for(int i=1,x;i<=n;i++) { x=rd(); if(i+x+1<=n+1)add(i,i+x+1,0); else add(i,n+1,i+x-n); if(i>1)add(i,i+1,1);//i>1 if(i>1)add(i,i-1,1); } dij(); printf("%lld\n",dis[n+1]); return 0;}

 

转载于:https://www.cnblogs.com/Zinn/p/10054327.html

转载地址:https://blog.csdn.net/weixin_30951743/article/details/95823503 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:tcMalloc 配置和优化 nginx 高性能
下一篇:poj2777Count Color——线段树+状压

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月01日 23时21分22秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章