const int maxv=1000;
const int inf=1000000000;
図1に示すように、隣接行列バージョンダイクストラ
const int maxv=1000;
const int inf=1000000000;
//1、邻接矩阵版Dijkstra
int G[maxv][maxv];
int n;
int d[maxv]; //起点到各点的最短路径长度
bool vis[maxv]={false};
void Dijkstra(int n)
{
fill(d,d+maxv,inf);
d[s]=0;
for(int i=0;i<n;i++) //n次,每次选出一个
{
int u=-1;
int min=inf;
for(int j=0;j<n;j++)
{
if(vis[j]==false&&d[j]<min)
{
u=j;
min=d[j];
}
}
if(u==-1) return;
vis[u]=true; //选出来,然后,别忘记置为true
for(int v=0;v<n;v++) //遍历其他点,看看能不能松弛
{
if(vis[v]==false&&G[u][v]!=inf&&d[u]+G[u][v]<d[v])
{
d[v]=d[u]+d[u][v];
}
}
}
}
図2に示すように、隣接するテーブルのバージョンダイクストラ
struct Node
{
int v;
int dis;
};
vector<Node> adj[maxv];
int n;
int d[maxv];
bool vis[maxv]={false};
void Dijkstra(int s)
{
fill(d,d+maxv,inf);
d[s]=0;
for(int i=0;i<n;i++)
{
int u=-1;
int min=inf;
for(int j=0;j<n;j++)
{
if(vis[j]==false&&d[j]<min)
{
u=j;
min=d[j];
}
}
if(u==-1) return;
vis[u]=true;
//从u出发,看看能到达哪些边,看看能不能松弛
for(int j=0;j<adj[u].size();j++)
{
int v=adj[u][j].v;
if(vis[v]==false&&d[u]+adj[u][j].dis<d[v])
{
d[v]=d[u]+adj[u][j].dis;
}
}
}
}