迪杰斯特拉算法求解最短路径

这段代码展示了如何利用迪杰斯特拉算法在无向图中寻找从特定顶点出发的最短路径。首先定义了图的结构,然后创建了一个无向图,并初始化所有顶点之间的距离。接着,迪杰斯特拉算法被用于更新从起点到每个顶点的最短路径,最后计算并输出从A点到各个顶点的最短路径。
摘要由CSDN通过智能技术生成

#include <stdio.h>
typedef int Status;
#define OK 1
#define ERROR 0

#define MaxInt 32767         //表示极大值,即∞
#define MVNum 100 
#define false -1
#define true 0           //最大顶点数 

typedef char VerTexType;     //顶点的数据类型为字符型 
typedef int ArcType;         //边的权值类型为整型 

typedef struct{ 
  //****
  VerTexType vexs[MVNum];//顶点的信息 
  ArcType arcs[MVNum][MVNum];
  int vexnum,arcnum,min ;

}AMGraph; 

int LocateVex(AMGraph &G,VerTexType v)
{
    //****
    /* 初始条件: 图G存在,v和G中顶点有相同特征*/
 /* 操作结果: 若G中存在顶点u,则返回该顶点在图中位置;否则返回-1 */
    for(int i=0;i<G.vexnum;i++)
    {
        if(v==G.vexs[i])
        return i;
    
        else return -1;
    }
    
    
}

Status CreateUDN(AMGraph &G)  //采用邻接矩阵表示法,创建无向图G

int i, j,k;
VerTexType v1,v2;
    /* printf("请输入边数和顶点数:"); */
    G.vexnum=10;
    G.arcnum=14;

    for (i = 0; i <G.vexnum; ++i)/* 初始化图 */
    {
        G.vexs[i]='A'+i;//为A到J的顺序输入方法 
    }

    for (i = 0; i < G.vexnum; ++i)/* 初始化图 */
    {
        for ( j = 0;j < G.vexnum; ++j)
        {
            
                G.arcs[i][j]=MaxInt;
            
        }
    }//a到各顶点的距离;
     
  
     G.arcs[0][1]=2;
   G.arcs[0][3]=1;
   G.arcs[0][2]=2;
//B
  G.arcs[1][3]=1;
  G.arcs[1][4]=1;
  //C
  G.arcs[2][4]=1;
  G.arcs[2][3]=4;
  //E
  G.arcs[4][5]=2;
  
  //F
  G.arcs[5][9]=4;
  G.arcs[5][8]=1;
  //H
  G.arcs[7][9]=1;
  G.arcs[7][6]=3;
  //J
  G.arcs[9][8]=4;
  //I
  G.arcs[8][6]=1;


    for(i = 0; i < G.vexnum; ++i)
    {
        for(j = i; j < G.vexnum; ++j)
        {
            G.arcs[j][i] =G.arcs[i][j];
        }
    }
return OK;
}

void ShowGraph(AMGraph &G)
{
    int i,j;
    printf("------Start------\n");
    printf("共有%d个顶点,%d条边:\n    ",G.vexnum,G.arcnum);
    
    for(i=0;i<G.vexnum;i++)
        printf("%3c",G.vexs[i]);
    printf("\n");
    for(i=0;i<G.vexnum;i++)
    {
        printf("    ");
        for(j=0;j<G.vexnum;j++) {if(G.arcs[i][j]==MaxInt)printf("  -");else printf("%3d",G.arcs[i][j]);}
        printf("%3c\n",G.vexs[i]);
    }
    printf("-------End-------\n");
    
}

void ShortestPath_DIJ(AMGraph& G, int v0, int D[], int Path[])  //迪杰斯特拉算法求解最短路径
{
//****
int n;
int min,v,w,S[MVNum],i;
n=G.vexnum;
for(int v=0;v<n;++v)
{    
    S[v]=false;
    D[v]=G.arcs[v0][v];
    if(D[v]<MaxInt) Path[v]=v0;
    else Path[v]=-1;
}

    S[v0]=OK;
    D[v0]=0;
    for(i=1;i<n;++i){
    min=MaxInt;
    for(w=0;w<n;++w)
        if(!S[w]&&D[w]<min){v=w;min=D[w];}
        S[v]=OK;
        for(w=0;w<n;++w)
            if(!S[w]&&(D[v]+G.arcs[v][w]<D[w]))
            {
                D[w]=D[v]+G.arcs[v][w];
                Path[w]=v;
            }
}
}

void CalcuPath(AMGraph &G,int Path[],char    ABC[],int aim)  //根据Path数组,计算从A点到第aim个结点的最短路径
{ //****
char b[MVNum];
    int c=0,k,i;
    for(k=aim; k!=0; k=Path[k]){
    b[c]=G.vexs[k];c++;
    }
    b[c]=G.vexs[0];
    for(i=0;i<=c;i++){
    ABC[i]=b[c-i];
    }
    ABC[c+1]='\0';
}


int main()
{
    AMGraph G;
    int i,D[10],Path[10];
    char ABC[10];
    
    CreateUDN(G);
    
    printf("\n------ 以下内容截屏提交学习通:------\n\n");
    ShowGraph(G);
    printf("\n");
    
    ShortestPath_DIJ(G, 0, D , Path);
    
    printf("          ");
    for(i=0;i<10;i++) printf("%3d",i);printf("\n");
    printf("          ");
    for(i=0;i<10;i++) printf("%3c",'A'+i);printf("\n");
    printf("   D[10]: ");
    for(i=0;i<10;i++) printf("%3d",D[i]);printf("\n");
    printf("Path[10]: ");
    for(i=0;i<10;i++) printf("%3d",Path[i]);printf("\n\n");
    
    for(i=0;i<10;i++)
    {
        CalcuPath(G,Path,ABC,i);
        printf("从A到%c 的最短路径:%s\n",G.vexs[i],ABC);
    }
    
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值