使用离散数学中关于迪克特斯拉算法例子
#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");
}