存图
int tot ;
int head[MAXN], nxt[MAXN], to[MAXN], w[MAXN] ;
void add_edge(int x, int y, int z)
{
to[++tot] = y ;
w[tot] = z ;
nxt[tot] = head[x] ;
head[x] = tot ;
}
Dijkstra(优先队列,不用重载运算符版本)
priority_queue<pii> q ;
void init()
{
memset(dis, 0x3f, sizeof(dis)) ;
}
void dijstra(int x)
{
init() ;
dis[x] = 0 ;
q.push(make_pair(0, x)) ;
while(!q.empty())
{
int u = q.top().second ;
q.pop() ;
if(vis[u] == 1) continue ;
vis[u] = 1 ;
for(int i = head[u] ; i ; i = nxt[i] )
{
int v = to[i] ;
if(dis[v] > dis[u] + w[i])
{
dis[v] = dis[u] + w[i] ;
q.push(make_pair(-dis[v], v)) ;
}
}
}
}
重载运算符版本
struct node
{
int dis ;
int pos ;
bool operator <(const node &s )const
{
return s.dis < dis ;
}
};
priority_queue<node> q ;
int vis[MAXN] ;
int dis[MAXN] ;
int n ;
void Dijkstra(int x)
{
for(int i = 1 ; i <= n ; i ++ ) dis[i] = 0x7fffffff ;
dis[x] = 0 ;
q.push((node){0, x}) ;
while(!q.empty())
{
node tmp = q.top() ;
q.pop() ;
int u = tmp.pos ;
// int d = tmp.dis ;
if(vis[u] == 1) continue ;
vis[u] = 1 ;
for(int i = head[u] ; i ; i = nxt[i])
{
int v = to[i] ;
if( dis[v] > dis[u] + w[i])
{
dis[v] = dis[u] + w[i] ;
if(vis[v] == 0 )
{
q.push((node){dis[v], v}) ;
}
}
}
}
}