求单源最短路径两顶点最短距离(BFS)

//(矩阵)求图G中顶点x的第一个临接点,如果有返回其下标,否则返回-1
int FirstNeighbor1(MGraph G,int x){
    if(x >= MaxVertexNum) return -1;
    for(int i = 0;i < MaxVertexNum;++i){
        if(G.Edge[x][i] >= 0 && G.Edge[x][i] < MaxDis )
            return i;
    }
    return -1;
}

//(矩阵)假设G中顶点y是顶点x的一个相邻结点,返回除y之外顶点x的下一个临接点的定点号,若y是最后一个顶点则返回-1
int NextNeighbor1(MGraph G,int x,int y){
    if(x >= MaxVertexNum) return -1;
    for(int i = y+1;i < MaxVertexNum;++i){
        if(G.Edge[x][i] >= 0 && G.Edge[x][i] < MaxDis )
            return i;
    }
    return -1;
}

//求图G中顶点x的第一个临接点,如果有返回其下标,否则返回-1(邻接表)
int FirstNeighbor2(ALGraph G,int x){
   if(x >= G.vertices) return -1;
   if(G.adjList[x].firstarc!= NULL)
       return G.adjList[x].firstarc->adjvex;
   else
       return -1;
}
//(邻接表)假设G中顶点y是顶点x的一个相邻结点,返回除y之外顶点x的下一个临接点的定点号,若y是最后一个顶点则返回-1
int NextNeighbor2(ALGraph G,int x,int y){
    ENode * temp = G.adjList[x].firstarc;
    while(temp!=NULL){
        if(temp->adjvex == y)
            break;
        else
            temp = temp->nextarc;
    }
    if(temp == NULL ||temp->nextarc == NULL)
        return -1;
    else
        return temp->nextarc->adjvex;
}

//求单源最短路径 (BFS) 两顶点最短距离
void BFS_Mix_Distance(Graph G,int u,int v){
    //d[i]表示从u到i结点的最短路径
    for(int i=0;i<G.vertices;i++){
        d[i]=MAXNUM;
    }
    int w;
    InitQueue(Q);
    visit(u);
    visited[u]=true;
    d[u]=0;
    EnQueue(Q,u);
    while(!isEmpty(Q)){
        DeQueue(Q,u);
        for(w=FirstNeighbor(G,u);w>=0;w=NextNeighbor(G,u,w)){
            if(visited[w]==false){
                visit(w);
                visited[w]=true;
                d[w]=d[u]+1;
                EnQueue(Q,w);
            }
        }
    }
}
posted @ 2019-12-27 22:36  ZzUuOo666  阅读(481)  评论(0编辑  收藏  举报