1. 程式人生 > >pb_ds庫的講解和應用舉例

pb_ds庫的講解和應用舉例

#include<iostream>
#include<algorithm>
#include<climits>
#include<cstdio>
#include<ext/pb_ds/priority_queue.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
const int M=1000005;
inline int read()
{
    int r=0;char c=getchar();
    while(c<'0'||c>'9') c=getchar();
    while(c>='0'&&c<='9') {r=r*10+c-'0';c=getchar();}
    return r;
}
struct node
{
    int i;
    ll v;
    node(int a=0,ll c=0){i=a;v=c;}
    bool operator < (node b) const
    {
        return v>b.v;
    }
};
typedef __gnu_pbds::priority_queue<node,less<node>,pairing_heap_tag> heap;//!!!
heap::point_iterator hit[M];
heap pq;
int n;
ll d[M];
int last[1000005],cnt;
struct data{int to,next,v;}e[10000005];
void insert(int u,int v,int w)
{
    e[++cnt].to=v;e[cnt].next=last[u];last[u]=cnt;e[cnt].v=w;
}
inline void setpath()
{
    int T,rxa,rxc,rya,ryc,rp,x,y,z,m;
    x=y=z=0;
    n=read();m=read();
    T=read();rxa=read();rxc=read();rya=read();ryc=read();rp=read();
    int a,b,q=min(n,T);
    for(int i=0;i<q;i++)
    {
        x=((ll)x*rxa+rxc)%rp;
        y=((ll)y*rya+ryc)%rp;
        a=min(x%n+1,y%n+1);
        b=y%n+1;
        insert(a,b,100000000-100*a);
    }
    for(int i=0;i<m-T;i++)
    {
        x=read(),y=read(),z=read();
        insert(x,y,z);
    }
}
ll dijkstra()
{
    for(int i=1;i<=n;i++) d[i]=LLONG_MAX;
    hit[1]=pq.push(node(1,0));
    d[1]=0;
    int o;
    while(!pq.empty())
    {
        o=pq.top().i;
        pq.pop();
        if(o==n) return d[o];
        for(int i=last[o];i;i=e[i].next)
        {
            if(d[e[i].to]>d[o]+e[i].v)
            {
                d[e[i].to]=d[o]+e[i].v;
                if(hit[e[i].to]==0) hit[e[i].to]=pq.push(node(e[i].to,d[e[i].to]));
                else pq.modify(hit[e[i].to],node(e[i].to,d[e[i].to]));
            }
        }
    }
}
int main()
{
    setpath();
    cout<<dijkstra();
    return 0;
}