码迷,mamicode.com
首页 > 其他好文 > 详细

迪杰斯特拉最短路径

时间:2019-08-27 22:58:45      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:cat   数据   pre   访问   scan   lib   gety   visit   迪杰斯特拉   

以4 a b 1 b c 6 a c 6 a d 2 d c 7 b e 6 c e 4 c f 5 d f 1 f e 6 e g 8 f g构造有向图并找出最短路径

#include <stdio.h>
#include <stdlib.h>
#define MaxVertexNum 100
#define BIG 100
typedef char VertexType;//顶点节点的数据类型
typedef int EdgeType;//边权值的数据类型
typedef struct{
    VertexType Vertex[MaxVertexNum];//顶点表
    EdgeType Edge[MaxVertexNum][MaxVertexNum];//邻接矩阵,边表
    int vertexnum,arcnum;//顶点数和边数
}MGraph;//邻接矩阵的存储结构
int Locate(VertexType v){
    if(v>=97){return (int)v-97;}
    else {return (int)v-65;}
}//将顶点转换为相应的位置
typedef struct{
    int vertex[MaxVertexNum];
    int top;
}Stack;
void CreatGraph(MGraph &M){
    EdgeType e;
    VertexType v1,v2;
    printf("输入节点数和边数:");
    scanf("%d %d",&M.vertexnum,&M.arcnum);
    printf("输入节点:");
    for(int i=0;i<M.vertexnum;i++){
        getchar();
        scanf("%c",&M.Vertex[i]);
    }
    for(int i=0;i<M.vertexnum;i++){
        for(int j=0;j<M.vertexnum;j++){
            M.Edge[i][j]=BIG;
        }
    }
    fflush(stdin);//清除缓存,防止下一次的scanf()函数失效
    printf("输入路径的权值及其两个节点:\n");
    for(int i=0;i<M.arcnum;i++){
        scanf("%d %c %c",&e,&v1,&v2);
        M.Edge[Locate(v1)][Locate(v2)]=e;
    }
}//构造一个有向图
void PrintGraph(MGraph &M){
    printf("邻接矩阵\n");
    for(int i=0;i<M.vertexnum;i++){
        printf("     %c ",M.Vertex[i]);
        for(int j=0;j<M.vertexnum;j++){
            if(M.Edge[i][j]!=BIG){
                printf("%d  ",M.Edge[i][j]);
            }
            else{printf("");}
        }
        printf("\n");
    }
}//打印邻接矩阵
void visited(int v){
    printf("%c ",v+a);
}//访问当前节点的位置
void Dijkstra(MGraph &M,VertexType a,int path[],int dist[]){
    int v=Locate(a);
    int set[MaxVertexNum];//标记节点是否已并入最短路径中
    int min,k;
    for(int i=0;i<M.vertexnum;i++){
        dist[i]=M.Edge[v][i];
        set[i]=0;
        if(M.Edge[v][i]!=BIG){
            path[i]=v;
        }
        else path[i]=-1;
    }
    set[v]=1;
    for(int i=0;i<M.vertexnum-1;i++){
        min=20;
        for(int j=0;j<M.vertexnum;j++){
            if(set[j]==0&&dist[j]<min){
                min=dist[j];
                k=j;
            }
        }
        set[k]=1;
        for(int j=0;j<M.vertexnum;j++){
            if(set[j]==0&&dist[k]+M.Edge[k][j]<dist[j]){
                dist[j]=dist[k]+M.Edge[k][j];
                path[j]=k;
            }
        }
    }
    for(int i=1;i<M.vertexnum;i++){
        printf("a到%c的最短路径为:%d\n",i+a,dist[i]);
    }
}
int main(){
    MGraph M;
    CreatGraph(M);
    PrintGraph(M);
    int dist[MaxVertexNum];//记录已找到的最短路径
    int path[M.vertexnum];//记录到vi的前一个顶点
    Dijkstra(M,a,path,dist);
}

技术图片

迪杰斯特拉最短路径

标签:cat   数据   pre   访问   scan   lib   gety   visit   迪杰斯特拉   

原文地址:https://www.cnblogs.com/Yshun/p/11421005.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!