pb_ds庫的講解和應用舉例
阿新 • • 發佈:2019-02-06
#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; }