#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXV 100
#define INF 100000
typedef struct
{
int n,e;
int edges[MAXV][MAXV];
}MGraph;
void Ppath(int path[],int i,int v)
{
int k;
k=path[i];
if(k==v)return;
Ppath(path,k,v);
printf("%d",k);
}
void dispath(int dist[],int path[], int s[],int n, int v)
{
int i;
for(i=0; i<n; i++)
if(s[i]==1)
{
printf("从%d到%d的最短路径长度为%d\t:路径为:",v,i,dist[i]);
printf("%d",v);
Ppath(path,i,v);
printf("%d\n",i);
}
else printf("从%d到%d不存在路径\n",v,i);
}
void dijkstra(MGraph g,int v)
{
int dist[MAXV],path[MAXV];
int s[MAXV];
int mindis,i,j,u;
for(i=0; i<g.n; i++)
{
dist[i]=g.edges[v][i];
s[i]=0;
if(g.edges[v][i]<INF)
path[i]=v;
else path[v]=-1;
}
s[v]=1;path[v]=0;
for(i=0; i<g.n; i++)
{
mindis=INF;
for(j=0; j<g.n; j++)
if(s[j]==0&&dist[j]<mindis)
{
u=j;
mindis=dist[j];
}
s[u]=1;
for(j=0 ;j<g.n; j++)
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);
}
}
int main()
{
int i,j,e;
int u,v,l;
MGraph g;
scanf("%d %d",&g.n,&e);
for(i=0; i<g.n; i++)
for(j=0; j<g.n; j++)
g.edges[i][j]=INF;
for(i=0;i<e; i++)
{
scanf("%d %d %d",&u,&v,&l);
g.edges[u][v]=l;
}
dijkstra(g,0);
system("pause");
return 0;
}
最短路径
最新推荐文章于 2025-01-20 17:23:52 发布