const int maxv=1000;
const int inf=1000000000;
1、全局变量
int G[maxv][maxv];
int n;
int d[maxv]; //起点到各点的最短路径长度
bool vis[maxv]={false};
int pre[maxv];
2、Dijkstra实现
void Dijkstra(int s)
{
fill(d,d+maxv,inf);
for(int i=0;i<n;i++) pre[i]=i;
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 j=0;j<n;j++)
{
if(vis[j]==false&&G[u][j]!=inf&&d[u]+G[u][j]<d[j])
{
d[j]=d[u]+d[u][j];
pre[j]=u; //j的前驱是u
}
}
}
}
3、递归输出最短路径
//s为起点,v为终点,求二者间最短路径
void dfs(int s,int v)
{
if(s==v) //递归边界
{
printf("%d\n",s);
return;
}
dfs(s,pre[v]); //递归调用
printf("%d\n",v);
}