博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 2259 [Oibh]新型计算机 ——最短路(建图)
阅读量:6995 次
发布时间:2019-06-27

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

题目:

不是 n^2 条边!连那条边权为0的边之后,只要每个位置向它的前一个位置和后一个位置连 1 的边,就能等价于一开始就走到那个位置了。

不会有情况使得操作后 a[ i ] 变成负数来走到 j 。因为那样一定不如走到 i 的时候别走到 i 而是直接走到 j 。

注意1号点。如果每个点都向后连 1 的边,最大代价岂不是不大于 n ?所以 1 不能向 2 连边权为1的边,因为1是起点,没有转化的空间。反正也没有点连向1号点。

#include
#include
#include
#include
#include
#define ll long longusing namespace std;const int N=1e6+5,M=N*3;int n,a[N],hd[N],xnt,to[M],nxt[M],w[M];ll dis[N];bool vis[N];priority_queue
> q;int rdn(){ int ret=0;bool fx=1;char ch=getchar(); while(ch>'9'||ch<'0'){ if(ch=='-')fx=0;ch=getchar();} while(ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar(); return fx?ret:-ret;}void add(int x,int y,int z){to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;w[xnt]=z;}void dj(){ memset(dis,0x3f,sizeof dis); dis[1]=0; q.push(make_pair(0,1)); while(q.size()) { int k=q.top().second; q.pop(); if(vis[k])continue; vis[k]=1; for(int i=hd[k],v;i;i=nxt[i]) if(dis[v=to[i]]>dis[k]+w[i]) { dis[v]=dis[k]+w[i]; q.push(make_pair(-dis[v],v)); } }}int main(){ n=rdn();for(int i=1;i<=n;i++)a[i]=rdn(); for(int i=1,d;i<=n;i++) { if(i>1)add(i,i-1,1),add(i,i+1,1);////if d=i+a[i]+1; if(d<=n+1)add(i,d,0); else add(i,n+1,d-(n+1)); } dj(); printf("%lld\n",dis[n+1]); return 0;}

 

转载于:https://www.cnblogs.com/Narh/p/10054304.html

你可能感兴趣的文章
Kafka学习之四 Kafka常用命令
查看>>
ruby 【rails在win7_64位操作系统安装】
查看>>
回溯法--0-1背包问题
查看>>
ubuntu hadoop集群 master免密码登陆到slave节点
查看>>
css3的背景多重运用
查看>>
关于 [栈溢出后jmp esp执行shellcode] 原理分析
查看>>
安全疏散(一)
查看>>
python_sort(key=) 的使用
查看>>
UT源码116
查看>>
git仓库远程连接GitHub
查看>>
Mysql配置参数说明
查看>>
Hello world,Hello 2015,Bye 2014
查看>>
asp.net中使用单例
查看>>
[Asp.Net]状态管理(Session、Application、Cache)
查看>>
mysql 跨服务器复制数据库
查看>>
用递归删除各种节点
查看>>
tomcat快速部署脚本
查看>>
20155332 2016-2017-2 《Java程序设计》第10周学习总结
查看>>
java 中list进行动态remove处理
查看>>
jsp不解析el表达式,不识别jstl标签,找不到http://java.sun.com/jsp/jstl/core
查看>>