1 流程
dist[所有点] = +∞
dist[起始点] = 0
小根堆
存入起始点(倒存方便排序)
while(堆不空)
{
取没走过的堆顶编号t
st[t] == true
用t更新其他所有出点(入堆)
}
判断是否能走
2 code
int dijstra( int u )
{
memset( dist, INF, sizeof dist );
dist[u] = 0;
priority_queue< PII, vector<PII>, greater<PII> > heap;
heap.push( { 0, u } );
while( heap.size() )
{
int t = heap.top().second;
heap.pop();
if( st[t] )
continue;
st[t] = true;
for( int i = h[t]; i; i = ne[i])
{
int y = e[i], z = w[i];
if( dist[y] > dist[t] + z )
{
dist[y] = dist[t] + z;
heap.push( { dist[y], y } );
}
}
}
if( dist[n] == 0x3f3f3f3f )
return -1;
else
return dist[n];
}