算法功能:求出源点和所有点之间的最短路径
算法思想:每次选取未处理点中离源点最近的点,更新源点和所有点的距离(能到位值,不能到位无穷),然后置为已经处理过.
具体见代码:
//dijkstra算法模板
#define MAXV 100//后面都会用到
#define INF 32768//INF表示正无穷
struct MGraph
{
double edges[MAXV][MAXV];//邻接矩阵的边数组
int n;//顶点数,弧度;
};
MGraph g;
void Ppath(int path[],int i,int v)//输出i点和源点v之间的最短路径
{
int k;
k=path[i];
if(k==v) return ;
Ppath(path,k,v);
cout<<k;
}
void Dispath(int dist[],int path[],int s[],int n,int v)//调用Ppath()输出源点和所有点之间的最短路径
{
int i;
for(i=0;i<n;i++)
if(s[i]==1)
{
printf("从%d到%d的最短路径长度为%d\n",v,i,dist[i]);
cout<<v; //起点
Ppath(path,i,v); //中间点
cout<<i<<endl; //终点
}
else printf("从%d到%d不存在\n"v,i);
}
/*需要对g.edges[][]初始化,这个在主函数中读取数据时做
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i!=j) g.edges[i][j]=INF;
else g.edges[i][j]=0;
}
*/
void Dijkstra(MGraph g,int v)//v为源点编号
{
int dist[MAXV];//最短路径长度
int path[MAXV];//保存在最短路径上的上一个点
int s[MAXV];//标记:1表示有最短路径
int mindis,i,j,u;
for(i=0;i<g.n;i++)
{
dist[i]=g.edges[v][i]; //距离初始化
s[i]=0; //s[]置空
if(g.edges[v][i]<INF) path[i]=v; //路径初始化
else path[i]=-1;
}
s[v]=1; path[v]=0;
for(i=0;i<g.n;i++)
{
mindis=INF;
for(j=0;j<g.n;j++) //选取不在s[]中且具有最小距离的顶点u
if(s[j]==0)
if(g.edges[u][j]<INF && dist[u]+g.edges[u][j]<dist[j])
{
u=j; mindis=dist[j];
}
s[u]=1; //将顶点u加入s[]中
for(j=0;j<g.n;j++) //修改不在s[]中顶点的距离
if(s[j]==0)
if(g.edges[u][j]<INF && dist[u]+g.edges[u][j]<dist[j])
{
dist[j]=dist[u]+g.edges[u][j];
path[j]=u;
}
}
dispath(dist,path,s,g.n,v); //输出最短路径
}