#include <stdio.h>
#define INFINITY INT_MAX //最大值
#define MAX_VERTEX_NUM 20 //最大顶点个数
#define MAX_NAME 5 //定点字符串的最大长度+1
#define MAX_INFO 20 //相关信息字符串的最大长度+1
#define FALSE 0
#define TRUE 1
typedef int VRType;
typedef char InfoType;
typedef char VertexType[MAX_NAME];
typedef int PathMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //用来存储最短路径
typedef int ShortPathTable[MAX_VERTEX_NUM];//v0到vi的距离
typedef enum {DG,DN,UDG,UDN} GraphKind
typedef struct ArcCell{
VRType adj; //顶点关系
InfoType *info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct{
VertexType vexs[MAX_VERTEX_NUM]; //顶点向量
AdjMatrix arcs; //邻接矩阵
int vexnum,arcnum; //图的当前顶点数和弧数
GraphKind kind; //图的种类标志
}MGraph;
void ShortestPath_DIJ(MGraph G,int v0,PathMatrix *p,ShortPathTable *D)
{// 用DIJ算法求有网G的v0顶点到其余顶点V的最短路径p[v]及带权长度
//D[v]。若p[v][w]为TRUE,则w是从v0到v当前求得最短路径上的顶点。
//final[v]为TRUE当且仅当v属于S,即已经求得从vo到v的最短路径
int v,w,i,j,min;
int final[MAX_VERTEX_NUM];//final[i]=1代表已经求出v0到vi的最短路径
for(v=0;v<G.vexnum;++v)
{
final[v]=FALSE;
(*D)[v]=G.arcs[v0][v].adj;
for(w=0;w<G.vexnum;++w) (*p)[v][w]=FALSE; //设空路径
if((*D)[v]<INFINITY) {
(*P)[v][v0]=TRUE; //v0到v有通路
(*P)[v][v]=TRUE;
}
}
(*D)[v0]=0;
final[v0]=TRUE; //初始化,v0顶点属于s集
for(i=1;i<G.vexnum;++i) //其余G.vexnum-1个顶点
{ //开始住循环,每次求得v0到顶点v的最短路径,并加v到s里
min=INFINITY; //当前所知离v0顶点的最近距离·
for(w=0;w<G.vexnum;++w)
if(!final[w]) //顶点在V-S中
if((*D)[w]<min) 找出当前未使用的点w的(*D)[w]最小值
{
v=w; // 保存当前邻接点中距离最小的点的号码
min=(*D)[w];
}//顶点离v0更近
final[v]=TRUR; //离v0顶点更近的v加入到s集
for(w=0;w<G.vexnum;++w) //更新当前最短路径及距离
{
if(!final[w] && min<INFINITY && G.arcs[v][w].adj<INFINITY
&&(min+G.arcs[v][w].adj<(*D)[w])) //从v0经新加入的节点再到w的距离比原来到w的距离近的话则更改最短距离
{//修改D[w]和p[w],w属于v-s
(*D)[w]=min+G.arcs[v][w].adj;
for(j=0;j<G.vexnum;++j)
(*p)[w][j]=(*p)[v][j]; //属于v0到v的顶点也属于v0带w的顶点
(*p)[w][w]=TRUE;
}
}
}
}//ShortestPath_DIJ