基于C语言的交通咨询系统设计

交通咨询系统设计

#include
#include

#define MVNum 100
#define Maxint 32767

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]=w;
    }
    printf("有向图的储存结构构建完毕!\n");
}


/*
用Dijkstra算法求有向图G的v1顶点到其他顶点v的最短路经p[v] 以及其权D[v]
设G是有向向图的邻接矩阵,若 边 不存在,则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]else
            P2[v]=0;
    }//end_for
    D2[v1]=0;
    S[v1]=TRUE;
    //开始循环,每次求得v1到某个v顶点的最短路经,并将v加到S集总
    for(i=2;ifor(w=1;w<=n;w++)
            if(!S[w] && D2[w]for(w=1;w<=n;w++)
            if(!S[w] && (D2[v]+G.arcs[v][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]//修改长度 
                        P[i][j]=P[i][k];
                    }
                }
        }
}


/*主函数*/
int main(void)
{
    MGraph G;
    int n,e,v,w,k;
    int xz=1;
    printf("输入图中顶点的个数和边数n,e:");
    scanf("%d,%d",&n,&e);
    CreateMGraph(&G,n,e);
    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");
}

你可能感兴趣的:(C语言)