迪杰斯特拉最短路径

以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);
}

转载于:https://www.cnblogs.com/Yshun/p/11421005.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值