#include<stdio.h>
#include<string.h>
#define INF 1000
#define MAXN 20
int n,m;
int Edge[MAXN][MAXN];
int S[MAXN]; //表示是否找到最短路径
int dist[MAXN]; //表示当前最短路径的距离
int path[MAXN];//最短路径的上一个顶点
void Dijkstra(int v0)
{
int i,j,k;
int u,min;
for(i=0;i<n;i++)
{
dist[i]=Edge[v0][i];
S[i]=0;
if(i!=v0 && dist[i]<INF)
path[i]=v0;
else
path[i]=-1;
}
S[v0]=1; dist[v0]=0;
for(i=0;i<n-1;i++)
{
min=INF;
u=v0;
for(j=0;j<n;j++)
{
if(S[j]==0 && dist[j]<min)
{
u=j;
min=dist[j];
}
}//选择u点加入
S[u]=1;
for(k=0;k<n;k++)
{
if(S[k]==0 && dist[u]+Edge[u][k]<dist[k])
{
dist[k]=dist[u]+Edge[u][k];
path[k]=u;
}
}//修改dist[i]的值
}//确定n-1条路径
}
int main()
{
int i,j,k;
int u,v,w;
int shortest[MAXN];
scanf("%d %d",&n,&m);
memset(Edge,0,sizeof(Edge));
for(j=0;j<m;j++)
{
scanf("%d%d%d",&u,&v,&w);
Edge[u][v]=w;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
if(i==j)
Edge[i][j]=0;
else if(Edge[i][j]==0)
Edge[i][j]=INF;
}
Dijkstra(0);
for(i=1;i<n;i++)
{
printf("%d\t",dist[i]);
memset(shortest,0,sizeof(shortest));
k=0;
shortest[k]=i;
while(path[shortest[k]]!=0)
{
k++;
shortest[k]=path[shortest[k-1]];
}
k++;
shortest[k]=0;
for(j=k;j>0;j--)
printf("%d->",shortest[j]);
printf("%d\n",shortest[0]);
}
system("PAUSE");
return 0;
}
Dijkatra 算法 计算一个点到其他点的最短路径
最新推荐文章于 2022-03-23 15:13:46 发布