zoukankan      html  css  js  c++  java
  • bzoj 2259 [Oibh]新型计算机 ——最短路(建图)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2259

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

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

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

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #define ll long long
    using 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<pair<ll,int> > 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
    ",dis[n+1]);
      return 0;
    }
  • 相关阅读:
    Pandas入门之十一:窗口函数
    Pandas入门之十:百分比与相关性
    Pandas入门之九:数据选择
    Pandas入门之八:字符串与文本数据
    Pandas入门之七:迭代
    Pandas入门之六:重建索引
    Pandas入门之五:自定义元素处理函数
    Pandas入门之四:统计描述
    Pandas入门之三:DataFrame
    Pandas入门之 二:Series
  • 原文地址:https://www.cnblogs.com/Narh/p/10054304.html
Copyright © 2011-2022 走看看