[BZOJ3040][STL配对堆]最短路(road)

数据范围较大的最短路

可以用pbds里的配对堆优化,可以O(1)插入,O(logn)修改

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <ext/pb_ds/priority_queue.hpp>
#define N 1000010
#define M 10000010
#define inf 100000000000000ll

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef pair<ll,int> pairs;
typedef __gnu_pbds::priority_queue<pairs,greater<pairs>,pairing_heap_tag> heap;

heap Q;
heap::point_iterator p[N];
int n,m,t,cnt;
ll rxa,rxc,rya,ryc,rp;
int G[N],vis[N];
ll dis[N];
struct edge{
  int t,nx;
  ll w;
}E[M];

inline void InserT(int x,int y,ll w){
  E[++cnt].t=y;E[cnt].nx=G[x];E[cnt].w=w;G[x]=cnt;
}

inline void dijkstra(){
  for(int i=1;i<=n;i++) dis[i]=inf;
  dis[1]=0; vis[1]=0; p[1]=Q.push(pairs(0,1));
  while(!Q.empty()){
    int x=Q.top().second; Q.pop(); vis[x]=0;
    for(int i=G[x];i;i=E[i].nx)
      if(dis[E[i].t]>dis[x]+E[i].w){
    dis[E[i].t]=dis[x]+E[i].w;
    if(vis[E[i].t]) Q.modify(p[E[i].t],pairs(dis[E[i].t],E[i].t));
    else p[E[i].t]=Q.push(pairs(dis[E[i].t],E[i].t)),vis[E[i].t]=1;
      }
  }
}

int main(){
  freopen("1.in","r",stdin);
  freopen("1.out","w",stdout);
  scanf("%d%d%d%d%d%d%d%d",&n,&m,&t,&rxa,&rxc,&rya,&ryc,&rp);
  ll x=0,y=0,z=0,a,b;
  for(int i=1;i<=t;i++){
    x=(x*rxa+rxc)%rp;
    y=(y*rya+ryc)%rp;
    a=min(x%n+1,y%n+1);
    b=max(y%n+1,y%n+1);
    InserT(a,b,1e8-100*a);
  }
  for(int i=1;i<=m-t;i++){
    scanf("%lld%lld%lld",&x,&y,&a);
    InserT(x,y,a);
  }
  dijkstra();
  printf("%lld\n",dis[n]);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值