beikejiedeerha 2019-12-31 17:19 采纳率: 0%
浏览 715

交通咨询问题:求任意两个顶点间最短路径,为什么无论输入哪两个顶点,都会显示无路径?

4.交通咨询系统
任务:设计一个简易交通咨询系统,能让旅客咨询从人一个城市到另一个城市之间的最短路径。
功能要求:
(1)建立交通网络图的存储结构,并输出;
(2)求单源最短路径(Dijkstra算法),并输出;
(3)求任一对城市之间的最短路径,并输出。
第三个,无论我输入哪两个,都会显示无路径,这是为什么呢?求解
(ps:因为代码不是自己写的,所以想问问怎么解决)谢谢啦

#include<stdio.h>
#include<stdlib.h>

#define MVNum 100
#define Maxint 0

typedef char VertexType;
typedef int Adjmatrix;

int D1[MVNum],P1[MVNum];
int D[MVNum][MVNum],P[MVNum][MVNum];

typedef enum {FALSE,TRUE}boolean;
typedef struct{
    VertexType vexs[MVNum] ;
    Adjmatrix arcs[MVNum][MVNum];
}MGraph;


/*采用邻接矩阵表示法构造有向图G,n,e表示图的当前顶点数和边数*/
void CreateMGraph(MGraph *G,int n,int e)
{
    int i,j,k,w;
    for(i=1;i<=n;i++)
        G->vexs[i]=(char)i;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            G->arcs[i][j]=Maxint;
    printf("输入%d条边的i,j及w: \n",e);
    for(k=1;k<=e;k++)
    {
        scanf("%d,%d,%d",&i,&j,&w);
        G->arcs[i][j]=G->arcs[j][i]=w;
    }
    printf("有向图的储存结构构建完毕!\n");
}


/*
用Dijkstra算法求有向图G的v1顶点到其他顶点v的最短路经p[v] 以及其权D[v]
设G是有向向图的邻接矩阵,若 边<i,j> 不存在,则G[i][j]=Maxint
S[v]为真当且仅当v属于S,即已求得从v1到v的最短路经 
*/
void Dijkstra(MGraph G,int v1,int n)
{
    int D2[MVNum],P2[MVNum];
    int v,i,w,min;
    boolean S[MVNum];
    for(v=1;v<=n;v++)
    {
        S[v]=FALSE;
        D2[v]=G.arcs[v1][v];
        if(D2[v]<Maxint)
            P2[v]=v1;
        else
            P2[v]=0;
    }//end_for
    D2[v1]=0;
    S[v1]=TRUE;
    //开始循环,每次求得v1到某个v顶点的最短路经,并将v加到S集总
    for(i=2;i<n;i++) 
    {
        min=Maxint;
        for(w=1;w<=n;w++)
            if(!S[w] && D2[w]<min)
            {
                v=w;
                min=D2[w];
            }
            S[v]=TRUE;
        for(w=1;w<=n;w++)
            if(!S[w] && (D2[v]+G.arcs[v][w]<D2[w]))
            {
                //修改D2[w]和P2[w],w属于V-S 
                D2[w]=D2[v]+G.arcs[v][w];
                P2[w]=v;
            }//end_if
    }//end_for
    printf("路经长度    路经\n");
    for(i=1;i<=n;i++)
    {
        printf("%5d",D2[i]);
        printf("%5d",i);
        v=P2[i];
        while(v!=0)
        {
            printf("<-%d",v);
            v=P2[v];
        }
        printf("\n");
    } 
}


/*弗洛伊德算法*/
void Floyd(MGraph G,int n)
{
    int i,j,k;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++) 
        {
            if(G.arcs[i][j]!=Maxint)
                P[i][j]=j;
            else
                P[i][j]=0;
            D[i][j]=G.arcs[i][j];
        }
        //做k次迭代,每次迭代均试图将顶点k扩充到当前求得的从i到j的最短路经Pij上 
        for(k=1;k<=n;k++)
        {
            for(i=1;i<=n;i++)
                for(j=1;j<=n;j++)
                {
                    if(D[i][k]+D[k][j]<D[i][j])
                    {
                        D[i][j]=D[i][k]+D[k][j];    //修改长度 
                        P[i][j]=P[i][k];
                    }
                }
        }
}


/*主函数*/
int main(void)
{
    MGraph G;

    int n,e,v,w,k;
    int i,j;
    int xz=1;
    printf("输入图中顶点的个数和边数n,e:");
    scanf("%d,%d",&n,&e);
    CreateMGraph(&G,n,e);
    printf("输出交通网络图的存储结构:\n");
     for(i=0;i<n;i++)
     {   for(j=0;j<n;j++)
             printf("%d\t",G.arcs[i][j]);
         printf("\n");
     }
    while(xz!=0)
    {
        printf("************求城市之间的最短路经************\n");
        printf("============================================\n");
        printf("1.求一个城市到所有城市的最短路经\n");
        printf("2.求任意的两个城市之间的最短路经\n");
        printf("============================================\n");
        printf("    请选择: 1 或 2 .    选择 0 退出 :");
        scanf("%d",&xz);
        if(xz==2)
        {
            Floyd(G,n);
            printf("请输入源点(或称起点)和终点: V , W : ");
            scanf("%d,%d",&v,&w);
            k=P[v][w];
            if(k==0)
                printf("顶点%d到%d无路经!\n",v,w);
            else
            {
                printf("从顶点%d到%d的最短路经是:%d",v,w,v);
                while(k!=w)
                {
                    printf("->%d",k);
                    k=P[k][w];
                }
                printf("->%d\n",w);
                printf("    路经长度:%d\n",D[v][w]);
            }
        }
        else
            if(xz==1)
            {
                printf("求单源路经,输入源点 v : ");
                scanf("%d",&v);
                Dijkstra(G,v,n);
            }
    }
    printf("结束求最短路经,再见!\n\n");
}

图片说明

  • 写回答

1条回答 默认 最新

  • GKatHere 2020-01-03 23:11
    关注
    /*采用邻接矩阵表示法构造有向图G,n,e表示图的当前顶点数和边数*/
    void CreateMGraph(MGraph *G,int n,int e)  //此函数有问题,不止一个问题
    {
        int i,j,k,w;
        for(i=1;i<=n;i++)
            G->vexs[i]=(char)i;
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                G->arcs[i][j]=Maxint;
        printf("输入%d条边的i,j及w: \n",e);
        for(k=1;k<=e;k++)
        {
            scanf("%d,%d,%d",&i,&j,&w);
            G->arcs[i][j]=G->arcs[j][i]=w;   // 如:你竟然敢让用户输入值作为矩阵下标
        }
        printf("有向图的储存结构构建完毕!\n");
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!