pb_ds库包括:
优先队列
平衡二叉树
Hash
准则:
需要合并时用pairing_heap_tag
使用时需要的库:
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/hash_policy.hpp>
#include <ext/pb_ds/priority_queue.hpp>
using namespace __gnu_pbds;
定义变量:
typedef __gnu_pbds::priority_queue<int> heap; //默认从大到小
typedef __gnu_pbds::priority_queue<int,greater<int> > heap; //默认从小到大
heap q;
heap::point_iterator id;
//-----------------------------------------------------
typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> rbtree;
rbtree q,qq;
//-----------------------------------------------------
gp_hash_table<int,bool>h;
使用方法:
//优先队列
while (!q.empty()) q.pop();
for (int i=1;i<=10;i++)q.push(i);
auto it=q.push(11);
q.modify(it,50);
cout<<q.top()<<endl;
q.erase(it);
cout<<q.top()<<endl;
assert ( q. top () == 10);
for (int i=10;i<=20;i++)qq.push(i);
q.join(qq);
cout<<q.top();
//---------------------------------------
//树
for (int i=1;i<=20;i+=2) q.insert(i);
// 插入序列 1、3、5、7、9、11、13、15、17、19
cout<<q.order_of_key(5)<<endl;
// 小于5的个数
auto x=q.find_by_order(6);
rbtree::iterator it=q.find_by_order(6);
// 查找第6大的数,0 为起点
cout<<*x<<endl;
cout<<*it<<endl;
// 输出结果为 13
q.erase(it);
x=q.find_by_order(6);
cout<<*x<<endl;
q.insert(13);
// 输出结果为 15
auto z=q.lower_bound(16);
cout<<*z<<endl;
//大于等于16的第一个数
auto zz=q.upper_bound(17);
cout<<*zz<<endl;
//大于16的第一个数
for (int i=21;i<=40;i+=2) qq.insert(i);
q.join(qq);
for (auto x:q) cout<<x<<' ';cout<<endl;
// 输出结果为 1、3、5......37、39
//注意合并的两颗树的值域的范围不能相交
q.split(29,qq);
for (auto x:q) cout<<x<<' ';cout<<endl;
//小于等于29的元素在q,其余在qq
//---------------------------------------
//Hash
h[1]=1;
cout<<h[1]<<endl;
for (auto x:h) cout<<x.second<<endl;
pb_ds+Dijktra
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <ext/pb_ds/priority_queue.hpp>
typedef long long ll;
#define pa pair<ll,int>
#define mp make_pair
using namespace std;
using namespace __gnu_pbds;
typedef __gnu_pbds::priority_queue<pa,greater<pa> > heap;
const int N=1e6+5,M=1e7+5;
const ll INF=1e15;
inline int read(){
char c=getchar();int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
int n,m,T,rxa,rxc,rya,ryc,rp,a,b;
int x,y,z;
struct edge{
int v,w,ne;
}e[M];
int cnt,h[N];
inline void ins(int u,int v,int w){
cnt++;
e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;
}
ll d[N];
heap q;
heap::point_iterator id[N];
void dij(){
for(int i=1;i<=n;i++) d[i]=INF;
d[1]=0;id[1]=q.push(mp(0,1));
while(!q.empty()){
int u=q.top().second;q.pop(); //printf("u %d\n",u);
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v,w=e[i].w;
if(d[v]>d[u]+w){
d[v]=d[u]+w;
if(id[v]!=0) q.modify(id[v],mp(d[v],v));
else id[v]=q.push(mp(d[v],v));
}
}
}
}
int main(){
//freopen("in.txt","r",stdin);
n=read();m=read();
T=read();rxa=read();rxc=read();rya=read();ryc=read();rp=read();
m=m-T;
while(T--){
x=y=z=0;
x=((ll)x*rxa+rxc)%rp;
y=((ll)y*rya+ryc)%rp;
a=min(x%n+1,y%n+1);
b=max(y%n+1,y%n+1);
ins(a,b,100000000-100*a);
}
while(m--) x=read(),y=read(),z=read(),ins(x,y,z);
dij();
printf("%lld",d[n]);
}