链式前向星(堆优化版)
void dijkstra(int s)//堆优化版
{
priority_queue<PII,vector<PII>,greater<PII>>q;//记得写在函数里面。
memset(d,0x3f,sizeof d);
memset(vis,0,sizeof vis);
d[s]=0;
q.push({0,s});//一定要距离放在前。
while(q.size())
{
auto t=q.top();
q.pop();
int u=t.second;
if(vis[u])continue;
vis[u]=1;
for(int i=h[u];i!=-1;i=ne[i])
{
int j=e[i];
if(d[j]>d[u]+w[i])//不能用min,因为只用小于的时候才能更新。
{
d[j]=d[u]+w[i];
q.push({d[j],j});
}
}
}
}
vector(堆优化版)
void dijkstra(int s)
{
priority_queue<PII,vector<PII>,greater<PII>>q;
memset(d,0x3f,sizeof d);
memset(vis,0,sizeof vis);
d[s]=0;
q.push({0,s});
while(q.size())
{
auto t=q.top();
q.pop();
int u=t.second;
if(vis[u])continue;
vis[u]=1;
for(auto ed:e[u])
{
int v=ed.v,w=ed.w;
if(d[v]>d[u]+w){
d[v]=d[u]+w;
q.push({d[v],v});
}
}
}
}
链式前向星(朴素)
void dijkstra(int s)
{
memset(d, 0x3f, sizeof d);
memset(st, 0, sizeof st);
d[s] = 0;
for(int i=0;i<n-1;i++){
int u=-1;
for(int j=1;j<=n;j++)
if(!st[j]&&(u==-1||d[u]>d[j]))//我把st[j]写成了st[u],debug了两个小时。。。
u=j;
st[u]=1;
for (int j= h[u]; j!=-1; j= ne[j])
{
int t = e[j];
d[t]=min(d[t],d[u]+w[j]);
}
}
}