最短路径

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值