思想:每次选择当前dis最小的点,更新其出边
时间复杂度:(n+m)logn
typedef pair<long long,int> pa;
priority_queue<pa,vector<pa>,greater<pa> > q;
void dijkstra(int s)
{
for (int i=1; i<=n; i++) dis[i]=oo; //不要忘记清空
dis[s]=0;
q.push(pa(0,s));
while (!q.empty())
{
pa k=q.top();
vis[k]=1; //如果没有vis标记,可能造成一个点多次入堆出堆,若重边很多则会退化为O(m^2)
q.pop();
int u=k.second;
for (int i=head[u];i;i=next[i])
{
int v=vet[i],l=val[i];
if (dis[u]+l<dis[v])
{
dis[v]=dis[u]+l;
if (!vis[v]) q.push(pa(dis[v],v));
}
}
}
}