zoukankan      html  css  js  c++  java
  • BZOJ 3040. 最短路(road)

    传送门

    就是个最短路....数据过于垃圾,随机边不用连都可以 $Ac$

    这里用的是线段树优化 $Dijkstra$ ,这样就不会一个节点反复进入堆里占空间了,速度显然更快

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    inline int read()
    {
        register int x=0,f=1; register char ch=getchar();
        while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
        while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
        return x*f;
    }
    const int N=1e6+7,M=1e7+7;
    const ll INF=1e18;
    int n,m;
    int fir[N],from[M],to[M],val[M],cntt;
    inline void add(int &a,int &b,int c) { from[++cntt]=fir[a]; fir[a]=cntt; to[cntt]=b; val[cntt]=c; }
    ll dis[N],A[N];
    int T[N<<2];
    void build(int o,int l,int r)
    {
        T[o]=l; if(l==r) { A[l]=INF; return; }
        register int mid=l+r>>1;
        if(l<=mid) build(o<<1,l,mid);
        if(mid<r) build(o<<1|1,mid+1,r);
    }
    void change(int o,int l,int r,int k,ll v)
    {
        if(l==r) { A[l]=v; return; }
        register int mid=l+r>>1,lc=o<<1,rc=lc|1;
        k<=mid ? change(lc,l,mid,k,v) : change(rc,mid+1,r,k,v);
        T[o]=(A[T[lc]]<A[T[rc]] ? T[lc] : T[rc]);
    }
    void Dijk()
    {
        for(register int i=1;i<=n;i++) dis[i]=INF;
        dis[1]=0; build(1,1,n); change(1,1,n,1,0);
        while(A[T[1]]<INF)
        {
            register int x=T[1]; register ll d=dis[x]; change(1,1,n,x,INF);
            for(register int i=fir[x];i;i=from[i])
            {
                register int &v=to[i]; if(dis[v]<=d+val[i]) continue;
                dis[v]=d+val[i]; change(1,1,n,v,dis[v]);
            }
        }
    }
    int main()
    {
        n=read(),m=read(); register int T,rxa,rxc,rya,ryc,rp; register int x=0,y=0,z=0;
        T=read(),rxa=read(),rxc=read(),rya=read(),ryc=read(),rp=read();
        for(register int i=1;i<=T;i++)
        {
            x=(1ll*x*rxa+rxc)%rp; y=(1ll*y*rya+ryc)%rp;
            register int a=min(x%n+1,y%n+1),b=max(y%n+1,y%n+1);
            add(a,b,100000000-100*a);
        }
        for(register int i=T+1;i<=m;i++)
        {
            x=read(),y=read(),z=read();
            add(x,y,z);
        }
        Dijk(); printf("%lld
    ",dis[n]);
        return 0;
    }
  • 相关阅读:
    鼠标滑过,解决ul下 li下a的背景与父级Li不同宽的问题
    php函数
    常用函数之数组函数
    php流程控制
    php运算符
    php常量
    php变量的数据类型
    PHP是什么
    css3新增属性
    html5的常用标签
  • 原文地址:https://www.cnblogs.com/LLTYYC/p/11495289.html
Copyright © 2011-2022 走看看