Dijkstra求单源最短路径

LEETCODE743

预定义:

#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;
	}
}        

猜你喜欢

转载自blog.csdn.net/MJ_Lee/article/details/88607330