BZOJ 3040最短路
题目描述
给定一个 NN 个点, MM 条有向边的带权图,请你计算从 SS 出发,到每个点的距离。
数据保证你能从 SS 出发到任意点。
输入输出格式
输入格式:
第一行两个整数 NN 、 MM ,表示点数和边数。 第二行六个整数 TT 、 rxarxa 、 rxcrxc 、 ryarya 、 rycryc 、 rprp 。
前 TT 条边采用如下方式生成:
- 初始化 x=y=z=0x=y=z=0 。
- 重复以下过程 TT 次:
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);则有一条从 aa 到 bb 的,长度为 1e8-100*a1e8−100∗a 的有向边。
后 M-TM−T 条边采用读入方式: 接下来 M-TM−T 行每行三个整数 x,y,zx,y,z ,表示一条从 xx 到 yy 长度为 zz 的有向边。
输出格式:
一个整数,表示 11 到 NN 的最短路。
输入输出样例
3 3
0 1 2 3 5 7
1 2 1
1 3 3
2 3 1
2
说明
1\leq N\leq 10^61≤N≤106 , 1\leq M\leq 10^71≤M≤107
1\leq x,y\leq N1≤x,y≤N , 0<z,rxa,rxc,rya,ryc,rp<2^{31}0<z,rxa,rxc,rya,ryc,rp<231
请采用高效的堆来优化Dijkstra算法。
Solution:
本题实在是毒瘤,而且内存限制还卡的那么死。
思路还是比较正常的堆优化dijkstra,只不过我们用的是更高效的配对堆(pbds中的配对堆)。
然后坑点就是空间很死,为了防止重复入队,我们记录一下堆中每个元素的迭代器,然后在三角不等式更新后直接判断该节点是否已在堆中,若在就直接modify修改值,否则才入队,这样能保证堆中元素不超过$N$。
代码:
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/priority_queue.hpp>
#define il inline
#define ll long long
#define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
using namespace std;
using namespace __gnu_pbds;
const int N=,M=;
const ll inf=;
int n,m,s,to[M+],w[M+],h[N],net[M+],cnt;
ll dis[N];
int T,rxa,rxc,rya,ryc,rp;
bool vis[N];
struct node{
int u;ll d;
node(int a=,ll b=){u=a,d=b;}
bool operator<(const node &a)const {return d>a.d;}
};
typedef __gnu_pbds::priority_queue<node,less<node>,pairing_heap_tag> heap; heap q;
heap::point_iterator id[N]; il int gi(){
int a=;char x=getchar();
while((x<''||x>'')&&x!='-')x=getchar();
while(x>=''&&x<='')a=(a<<)+(a<<)+x-,x=getchar();
return a;
} il void add(int u,int v,int c){to[++cnt]=v,net[cnt]=h[u],h[u]=cnt,w[cnt]=c;} il void spfa(){
For(i,,n) dis[i]=inf;
dis[s]=,q.push(node(s,));
while(!q.empty()){
node x=q.top();q.pop();
int u=x.u;
if(vis[u])continue;
vis[u]=;
for(int i=h[u];i;i=net[i])
if(dis[to[i]]>dis[u]+w[i]){
dis[to[i]]=dis[u]+w[i];
if(id[to[i]]==)id[to[i]]=q.push(node(to[i],dis[to[i]]));
else q.modify(id[to[i]],node(to[i],dis[to[i]]));
}
}
} int main(){
n=gi(),m=gi(),T=gi(),rxa=gi(),rxc=gi(),rya=gi(),ryc=gi(),rp=gi(),s=;
ll x=,y=,z=,a,b;
m-=T;
For(i,,T){
x=(x*rxa+rxc)%rp,
y=(y*rya+ryc)%rp,
a=min(x%n+,y%n+),
b=max(y%n+,y%n+);
add(a,b,-*a);
}
For(i,,m) x=gi(),y=gi(),z=gi(),add(x,y,z);
spfa();
cout<<dis[n];
return ;
}
BZOJ 3040最短路的更多相关文章
- BZOJ 3040: 最短路(road) ( 最短路 )
本来想学一下配对堆的...结果学着学着就偏了... 之前 kpm 写过这道题 , 前面的边不理它都能 AC .. 我也懒得去写前面的加边了... 用 C++ pb_ds 库里的 pairing_hea ...
- BZOJ 3040: 最短路(road) [Dijkstra + pb_ds]
3040: 最短路(road) Time Limit: 60 Sec Memory Limit: 200 MBSubmit: 2476 Solved: 814[Submit][Status][Di ...
- BZOJ 3040 最短路 (堆优化dijkstra)
这题不是裸的最短路么?但是一看数据范围就傻了.点数10^6,边数10^7.这个spfa就别想了(本来spfa就是相当不靠谱的玩意),看来是要用堆优化dijkstra了.但是,平时写dijkstra时为 ...
- Bzoj 3694: 最短路 树链剖分
3694: 最短路 Time Limit: 5 Sec Memory Limit: 256 MBSubmit: 67 Solved: 34[Submit][Status][Discuss] Des ...
- 【刷题】BZOJ 2125 最短路
Description 给一个N个点M条边的连通无向图,满足每条边最多属于一个环,有Q组询问,每次询问两点之间的最短路径. Input 输入的第一行包含三个整数,分别表示N和M和Q 下接M行,每行三个 ...
- BZOJ 2125: 最短路
2125: 最短路 Time Limit: 1 Sec Memory Limit: 259 MBSubmit: 756 Solved: 331[Submit][Status][Discuss] D ...
- BZOJ.2125.最短路(仙人掌 最短路Dijkstra)
题目链接 多次询问求仙人掌上两点间的最短路径. 如果是在树上,那么求LCA就可以了. 先做着,看看能不能把它弄成树. 把仙人掌看作一个图(实际上就是),求一遍根节点到每个点的最短路dis[i]. 对于 ...
- bzoj 1880 最短路
我们首先知道,答案肯定是最短路图中的某段公共链,那么设(x,y)为x到y的最短路,那么答案为((s1,t1)+(s2,t2)-min((s1,s2)+(t1,t2),(s1,t2),(s2,t1))) ...
- bzoj 2125 最短路——仙人掌两点间最短路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2125 因为看了TJ又抄了标程,现在感觉还是轻飘飘的……必须再做一遍. 两点间的情况: 1.直 ...
随机推荐
- POJ3259_Wormholes_KEY
题目传送门 题目大意:有F组数据,N表示有N点,M表示有M条边,走一遍边需要花费Ti个时间,还有W个虫洞,可以向前回溯Ti时间,求能否从1点出发,经过一些路或虫洞回到1点后时间为负. 建图后用SPFA ...
- IO 转换流
package TestIo; import java.io.*; /** * 转换流 */ public class TestConvertStream { public static void m ...
- 抽样分布(2) t分布
定义 t分布 设X ~ N(0,1),Y ~ χ2(n),且X,Y相互独立,则称随机变量 服从自由度为n的t分布(学生氏分布) 记为 t~t(n),其概率密度为 由于tn(x)是偶函数,其图形关于y轴 ...
- 根据wsdl生成服务端代码
场景描述 最近在和一家公司做业务接口对接,由他们那边回调我们这边,对方直接扔过来一个webservice的wsdl文件,让我们按照他们的规范来做webservice服务, 大多数的对接应该是我们创建完 ...
- lesson 16 Mary had a little lamb
lesson 16 Mary had a little lamb a little + 可数 小的;+ 不可数 少量的 对于动物在幼时都有不同的称呼: calf 小牛 lamb 羊羔 piglet 小 ...
- CSP201403-2:窗口
引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...
- 对HashMap进行排序
首先来看看Map集合获取元素的三种常见方法keySet().values().entrySet() 1. values():返回map集合的所有value的Collection集合(于集合中无序存放) ...
- Git 简易食用指南 v2.0
写在前面 一开始我们先聊一聊版本控制,什么是版本控制呢?版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统.具体大类分为: 本地版本控制系统 集中式版本控制系统SVN 分布式 ...
- opencv-学习笔记(5)形态学转变
opencv-学习笔记(4)形态学转变 本章讲了几种形态学操作 腐蚀erode 膨胀dilate 开运算MORPH_OPEN 闭运算MORPH_CLOSE 形态学梯度MORPH_GRADIENT 礼帽 ...
- Chameleon-mini简介
ChameleonMini(变色龙)原德国大学在研究RFID安全时所设计的一块针对多频段多类型RFID模拟的硬件,其设计本身支持ISO14443和ISO15693标准协议,最简单直接的用法就是把获取到 ...