非映射堆版:
#include <bits/stdc++.h>
using namespace std ;
const int maxn = 20000 + 5 ;
long long d[maxn];
int vis[maxn];
int n , m;
struct Pri{
int v;long long c;
Pri(){}
Pri(int _v , long long _c):v(_v) , c(_c){}
bool operator <(const Pri &o)const
{
return c > o.c;
}
};
vector <Pri> p[maxn];
typedef vector <Pri> ::iterator iter;
void dijkstra(int scr)
{
priority_queue<Pri>q;
memset (d , 0x3f , sizeof (d));
d[scr]=0 ;
q.push( Pri(scr,0 ) );
while (!q.empty() )
{
Pri t=q.top();
q.pop();
if (vis[t.v])continue ;
vis[t.v]=1 ;
for (iter it=p[t.v].begin();it!=p[t.v].end();it++)
{
if (d[it->v] > d[t.v] + it->c)
{
d[it->v] = d[t.v] + it->c;
if (!vis[it->v])
q.push( Pri( it->v, d[it->v] ) );
}
}
}
}
映射堆版:
#include <bits/stdc++.h>
#include <ext/pb_ds/priority_queue.hpp>
using namespace std ;
const int maxn = 20000 + 5 ;
long long d[maxn];
int vis[maxn];
int n , m;
struct Pri{
int v;long long c;
Pri(){}
Pri(int _v , long long _c):v(_v) , c(_c){}
bool operator <(const Pri &o)const
{
return c > o.c;
}
};
typedef vector <Pri> ::iterator iter;
vector <Pri> p[maxn];
typedef __gnu_pbds::priority_queue<Pri> pq;
void dijkstra(int scr)
{
pq q;
vector <pq::point_iterator> qpi;
qpi.resize(n+1 );
for (int i=0 ;i<=n;i++)qpi[i]=q.push(Pri(i,0x7fffffff ));
memset (d , 0x3f , sizeof (d));
q.modify(qpi[scr],Pri(scr,0 ));
d[scr]=0 ;
while (!q.empty())
{
Pri t=q.top();
for (iter it=p[t.v].begin();it!=p[t.v].end();it++)
{
if (d[it->v] > d[t.v] + it->c)
{
d[it->v] = d[t.v] + it->c;
if (qpi[it->v] != qpi[0 ])
q.modify(qpi[it->v],Pri(it->v,d[it->v]));
}
}
qpi[t.v]=qpi[0 ];
q.pop();
}
}