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

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

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

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

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

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    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<N>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
    ",dis[n+1]);
      return 0;
    }
  • 相关阅读:
    移动布局---1. 移动端布局基础
    1. CSS新特性之选择器
    1. H5新增语义化标签
    POJ 3281
    poj 1986
    POJ 3728
    poj 2763
    poj 2749
    uva 11294
    LA 3713
  • 原文地址:https://www.cnblogs.com/Zinn/p/10054327.html
Copyright © 2011-2022 走看看