数据结构-迪克特斯拉算法(最短路径)

使用离散数学中关于迪克特斯拉算法例子

 

#include<stdio.h>
#include <stdlib.h>

#define MAXV 100
#define INF 32767 //INF表示∞
typedef char InfoType;
typedef struct
{
 int no;
 InfoType info;
}VertexType;
typedef struct
{
 int edges[MAXV][MAXV];//邻接矩阵
 int n,e;//顶点数和边数
 VertexType vex[MAXV];//存放顶点总和
}MGraph;

//查找路径顶点
void Ppath(int path[],int i,int v)  //前向递归查找路径上的顶点
{
 int k;
 k=path[i];
 if (k==v)  return;   //找到了起点则返回
 Ppath(path,k,v);   //找顶点k的前一个顶点
 printf("%d,",k);   //输出顶点k
}
//输出最短路径
void DisplayPath(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)//v为源点
{
 int dist[MAXV],path[MAXV];//dist[]存放源点到各点的距离,path[]存放最短路径长度
 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[i]=-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;//顶点u加入s中
  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;
    }
   }
  }
 }
 //输出最短路径
 DisplayPath(dist,path,s,g.n,v);
}

void main()
{
 MGraph g;
 g.n=10;
 g.e=17;
 int a[MAXV][MAXV]=
 {
  {0,3,5,3,INF,INF,INF,INF,INF,INF},
  {3,0,INF,INF,3,6,INF,INF,INF,INF},
  {5,INF,0,4,2,INF,6,INF,INF,INF},
  {3,INF,4,0,INF,8,INF,INF,INF,INF},
  {INF,3,2,INF,0,INF,INF,7,3,INF},
  {INF,6,INF,8,INF,0,8,5,INF,3},
  {INF,INF,6,INF,INF,8,0,INF,2,INF},
  {INF,INF,INF,INF,7,5,INF,0,INF,2},
  {INF,INF,INF,INF,3,INF,2,INF,0,2},
  {INF,INF,INF,INF,INF,3,INF,2,2,0}
 
 };
 for(int i=0;i<MAXV;i++)
 {
  for(int j=0;j<MAXV;j++)
  {
   g.edges[i][j]=a[i][j];
  }
 }

 Dijkstra(g,0);
 printf("\n");
}

 

你可能感兴趣的:(数据结构,算法,struct,ini,Path)