Dazzling Aurora 2022-05-15 16:26 采纳率: 75%
浏览 33
已结题

Dijkstra算法

  1. 从键盘输入一串字符,表示若干个顶点的信息

  2. 输入若干个字符对和一个整数,分别表示弧尾、弧头和权值,以#作为输入结束

  3. 输入一个顶点信息

  4. 求出该顶点到其余各顶点的最短路径。
    输入:ABCDEFGH
    AB 6
    AD 1
    AF 50
    BC 43
    BD 11
    BE 6
    CH 8
    DE 12
    EC 38
    EG 24
    FE 1
    FG 12
    GH 20

    A
    问题:输出都为0

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h> 
#define MaxSize 10
#define MaxVertices 50
#define MAXNUM 32767
int dist[MaxVertices];//存放从顶点v0到其他各顶点的当前最短路径的长度 
int path[MaxVertices];//存放在最短路径上该顶点的前一顶点 
int s[MaxVertices];//存放已求得的在最短路径上的顶点 
typedef struct
{
    char vertex[MaxSize];//用来存储数组顶点信息
    int act[MaxSize][MaxSize];//邻接矩阵用二维数组表示
    int vertexNum, arcNum;
}Mgraph; 
int inorder(Mgraph *G)
{
    int i = 0;
    char c;
    c = getchar();
    while(c!='\n')
    {
        G->vertex[i]=c;
        i++;
        c=getchar();
    }
    return i;
}
//建立有向图
void Createjm(Mgraph *G,int n)
{
    int i,j,k;
    int a,b;
    char s,y;
    G->vertexNum=n;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            G->act[i][j]=0;
        }
    }
    while(1)
    {
        scanf("%c",&s);
        if(s=='#')break;
        else
        {
            scanf("%c %d",&y,&k);
            a=(int)s-65;b=(int)y-65;
            G->act[a][b]=k;
            getchar();
       }
    }
} 
void Dijkstra(Mgraph *G,char q)//G是具有n个顶点的带权有向图,求从源点v到其余各顶点的最短路径长度 
{
    int v;
    v=(int)q-65;
    char m;
    int i,j;
    for(i=0;i<G->vertexNum;i++)
    {
        dist[i]=G->act[v][i];
        s[i]=0;
        if(i!=v&&dist[i]<MAXNUM)
        path[i]=v;
        else
        path[i]=-1;//顶点i无前顶点 
    }
    s[v]=1;//顶点v加入已求出的最短路径的顶点集合
    dist[v]=0;
    for(i=0;i<G->vertexNum;i++)//求其余n-1个顶点的最短路径
    {
        int min=MAXNUM;
        int u=v;
        for(j=0;j<G->vertexNum;j++)
            if(!s[j]&&dist[j]<min)
            {
                u=j;
                min=dist[j];
            }
            s[u]=1;//顶点u加入到已求出最短路径的顶点集合
            m=(char)(u+65);
            if(m!=q)
            {
            printf("%c%c %d",q,m, min);
            printf("\n");
            }    
            for(int w=0;w<G->vertexNum;w++)//修改其余顶点的当前最短路径
            if(!s[w]&&G->act[u][w]<MAXNUM&&dist[u]+G->act[u][w]<dist[w])
            {
                dist[w]=dist[u]+G->act[u][w];
                path[w]=u; 
             } 
     } 
}
int main()
{
    Mgraph G;
    int k;
    k = inorder(&G);
    Createjm(&G,k);
    getchar();
    char s;
    s=getchar();
    int v;
    v=(int)s-65;
    Dijkstra(&G,s);
}

img

img

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 已结题 (查看结题原因) 5月16日
    • 创建了问题 5月15日

    悬赏问题

    • ¥15 有偿四位数,节约算法和扫描算法
    • ¥15 VUE项目怎么运行,系统打不开
    • ¥50 pointpillars等目标检测算法怎么融合注意力机制
    • ¥15 关于超局变量获取查询的问题
    • ¥20 Vs code Mac系统 PHP Debug调试环境配置
    • ¥60 大一项目课,微信小程序
    • ¥15 求视频摘要youtube和ovp数据集
    • ¥15 在启动roslaunch时出现如下问题
    • ¥15 汇编语言实现加减法计算器的功能
    • ¥20 关于多单片机模块化的一些问题