该算法和最小生成树的Prim算法十分相似
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
#define MAXEDGE 100
#define MAXVEX 100
#define INFINITY 65535
struct MGraph
{
char V[10];
int Edge[10][10];
int Vexnum;
int Edgenum;
};
void CreateGraph(MGraph *G) //初始化邻接矩阵
{
printf("请输入顶点数和边数:");
scanf("%d%d",&(G->Vexnum),&(G->Edgenum));
char c;
c=getchar();
int i,j;
for(i=0;i<G->Vexnum;i++)
for(j=0;j<G->Vexnum;j++)
G->Edge[i][j]=INFINITY;
printf("请输入顶点信息(char)型\n");
for(i=0;i<G->Vexnum;i++)
scanf("%c",&(G->V[i]));
c=getchar();
int w;
for(int k=0;k<G->Edgenum;k++)
{
printf("请输入(vi,vj)的下标i,j和权值w:");
scanf("%d%d%d",&i,&j,&w);
c=getchar();
G->Edge[i][j]=w;
G->Edge[j][i]=w;
}
}
int min(int a,int b)
{
return a<b?a:b;
}
int d[MAXVEX];
void Dijkstra(int s,MGraph G)
{
bool used[MAXVEX];
fill(used,used+G.Vexnum,false);
fill(d,d+G.Vexnum,INFINITY);
d[s]=0;
while(true)
{
int v=-1;
for(int i=0;i<G.Vexnum;i++)
{
if(!used[i]&&(v==-1||d[i]<d[v]))
v=i;
}
if(-1==v)
break;
used[v]=true;
for(int k=0;k<G.Vexnum;k++)
{
d[k]=min(d[k],d[v]+G.Edge[v][k]);
}
}
}
void main()
{
MGraph G;
CreateGraph(&G);
int s=0;
Dijkstra(s,G);
for(int i=0;i<G.Vexnum;i++)
printf("原点%c到%c点的最小距离是:%d\n",G.V[s],G.V[i],d[i]);
}