朴素Dijkstra : O(V^2)
void Dijkstra(int s,int n) // s为起点 s-t是所有点的集合
{
for (int i=0;i<n;i++)
dist[i]=INT_MAX; //limits.h
memset(vis,0,sizeof(vis)); //string.h
dist[s]=0;
int ok=1;
while(ok)
{
ok=0;
int min=INT_MAX;
int k;
for (int i=0;i<n;i++)
if ((!vis[i])&&(dist[i]<min))
{
min=dist[i];
k=i;
ok=1;
}
vis[k]=1;
for (int i=0;i<n;i++)
if (!vis[i])
{
if (dist[i]>dist[k]+d[k][i])
{
dist[i]=dist[k]+d[k][i];
}
}
}
}
STL堆+Dijkstra: O(ElogV)
priority_queue <pair<int ,int>,vector<pair<int ,int> >,greater<pair<int,int> > > PQ;
void Dijkstra(int s,int n)
{
for (int i=0;i<n;i++)
dist[i]=INT_MAX; //limits.h
memset(vis,0,sizeof(vis)); //string.h
dist[s]=0;
while(!PQ.empty())
PQ.pop();
PQ.push(make_pair(dist[s],s));
while(!PQ.empty())
{
int k=PQ.top().second;
PQ.pop();
if (!vis[k])
{
vis[k]=1;
for (int i=0;i<n;i++)
if (!vis[i])
{
if (dist[i]>dist[k]+d[i][k])
{
dist[i]=dist[k]+d[i][k];
PQ.push(make_pair(dist[i],i));
}
}
}
}
}