预定义:
#define MVNum 100
#define IMAX 88888 //无穷大
//邻接矩阵
typedef struct{
//int vex[MVNum];
int arc[MVNum][MVNum];
int vexnum, arcnum;
}MGraph;
构造邻接矩阵:
int LocateVex(AMGraph *G,VerTexType v){
for(int i=0;i<G->vexnum;i++){
if(G->vex[i]==v)
return i;
}
return -1;
}
int CreateGraph()
{
MGraph* G;
G->vexnum=x;
G->arcnum=x;
//初始化为无穷
for(i=0;i<G->vexnum;i++){
for(j=0;j<G->vexnum;j++)
G->arc[i][j]=MAX;
}
//将边和权值写到邻接矩阵中,连通即为权值,否则为无穷大
for(k=0;k<G->arcnum;k++)
{
i=LocateVex(G,v1);
j=LocateVex(G,v2);
G->arc[i][j]=weight;
}
}
Dijkstra算法:
//两个关键数组:dist[]和S[];
//共N个节点
void dijkstra(Graph G, int k)
{
//初始化,记录节点K到各个顶点的距离
int dist[G->vexnum];
memcpy(dist,G->arc[k],G->vexnum*sizeof(int));
//初始化,记录节点有没有找到最短路径
bool S[G->vexnum];
memset(S,false,sizeof(S));
//将自己写进去
S[k]=true;
dist[k]=0;
//共进行N-1次循环,直到所有顶点都包含在S中。不要忽略'-1',不然第N次循环S全是true==>min=MAX==>return;
for(i=0;i<G->vexnum-1;i++){
//找出没被访问过且dis[]值最小节点
min=MAX;
for(j=0;j<G->vexnum;j++){
if(!S[j]&&min>dist[j]){
min=dist[j];
v=j;
}
}
//以节点v为中介更新各个节点的最小距离
if(min!=MAX){
S[v]=true; //找到最短路径
for(j=0;j<G->vexnum;j++){
if(!S[j]&&dist[j]>dist[v]+G->arc[v][j]){
dist[j]=dist[v]+G->arc[v][j];
}
}
}
//所有还没被找到最短路径节点的dist[]都是无穷,即循环次数没到却不能继续访问了
else
return;
}
}