【数据结构】最短路径

来源:互联网 发布:网络四大神书下载 编辑:程序博客网 时间:2024/05/29 03:10

#include<stdafx.h>

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define OK 1

#define ERROR 0

 

//自定义结构型邻接矩阵

typedef struct{

    intv[3];

}Shortest_Road;

 

 

 

 

//创建有向图的邻接矩阵(图示给出)

int Creat_Roadgraph(Shortest_Road *V)

{

    inti;

    for(i=0;i<3;i++)

       V[i].v[i]=0;

    printf("             请输入(1)号位置的路径长度:(输入表示不可达)\n");

    scanf(            "%d",&V[0].v[1]);

    printf("             请输入(2)号位置的路径长度:(输入表示不可达)\n");

    scanf(            "%d",&V[0].v[2]);

    printf("             请输入(3)号位置的路径长度:(输入表示不可达)\n");

    scanf(            "%d",&V[1].v[0]);

    printf("             请输入(4)号位置的路径长度:(输入表示不可达)\n");

    scanf(            "%d",&V[1].v[2]);

    printf("             请输入(5)号位置的路径长度:(输入表示不可达)\n");

    scanf(            "%d",&V[2].v[0]);

    printf("             请输入(6)号位置的路径长度:(输入表示不可达)\n");

    scanf(            "%d",&V[2].v[1]);

    printf("                 有向图的邻接矩阵创建成功!!!\n");

    returnOK;

}

 

 

 

 

//输出有向图的邻接矩阵及可直达路径

int Print_Roadgraph(Shortest_Road *V)

{

    printf("                         有向图的邻接矩阵为:                    \n\n");

    printf("                        V     V0     V1      V2                 \n");

    printf("                                                                \n");

    printf("                                                                \n");

    printf("                        V0     0      %d      %d                \n",V[0].v[1],V[0].v[2]);

    printf("                                                                \n");

    printf("                                                                \n");

    printf("                        V1     %d     0       %d                \n",V[1].v[0],V[1].v[2]);

    printf("                                                                \n");

    printf("                                                                \n");

    printf("                        V2     %d     %d       0                \n",V[2].v[0],V[2].v[1]);

    returnOK;

}

 

 

 

 

 

//输出可达的路径

int print_KDroad(Shortest_Road *V)

{

    inti,j,k=0;

    printf("                         所有的可直达的路径为:\n");

    for(i=0;i<3;i++)

       for(j=0;j<3;j++)

           if(V[i].v[j]!=0){printf("                               <V%d,V%d>\n",i,j);k++;}

    if(k==0)printf("                        无可直达的路径!!!\n");

    returnOK;

}

 

   

 

 

      

//输出最短路径的邻接矩阵

int print_Shortest_Roadgraph(Shortest_Road *V)

{

    inti,j,a,b,n=0;

    for(i=0;i<3;i++)

       for(j=0;j<3;j++)

           if(V[i].v[j]==0){V[i].v[j]=100000;n++;if(n==9){printf("一切皆不可达!!!\n");returnOK;}}

    for(i=0;i<3;i++)

    {a=i+1;

    b=i+2;

    if(a==3)a=0;

    if(b==3)b=0;

    if(b==4)b=1;

    if(V[a].v[b]>V[a].v[i]+V[i].v[b])V[a].v[b]=V[a].v[i]+V[i].v[b];

    if(V[b].v[a]>V[b].v[i]+V[i].v[a])V[b].v[a]=V[b].v[i]+V[i].v[a];

    }

    for(i=0;i<3;i++)

       for(j=0;j<3;j++)

           if(V[i].v[j]==100000)V[i].v[j]=0;

    printf("                         最短路径的邻接矩阵为:                  \n");

    printf("                        V      V0    V1      V2                 \n");

    printf("                                                                \n");

    printf("                                                                \n");

    printf("                        V0     0     %d       %d                \n",V[0].v[1],V[0].v[2]);

    printf("                                                                \n");

    printf("                                                                \n");

    printf("                        V1     %d     0       %d                \n",V[1].v[0],V[1].v[2]);

    printf("                                                                \n");

    printf("                                                                \n");

    printf("                        V2     %d     %d       0                \n",V[2].v[0],V[2].v[1]);

    returnOK;

}

 

 

 

 

 

//主函数

void main()

{

    Shortest_Road *V;

    V=(Shortest_Road *)malloc(3*sizeof(Shortest_Road));

    intflag=1,select;

    printf("                     图示如下(Floyd算法,邻接矩阵,1~6)       \n\n");

    printf("                        V      V0    V1      V2              \n");

    printf("                                                             \n");

    printf("                                                             \n");

    printf("                        V0     0     (1)     (2)             \n");

    printf("                                                             \n");

    printf("                                                              \n");

    printf("                        V1    (3)     0      (4)             \n");

    printf("                                                             \n");

    printf("                                                              \n");

    printf("                        V2    (5)    (6)      0              \n");

    printf("==============================菜单============================\n");

    printf("=                  1.创建有向图的邻接矩阵(图示给出)          =\n");

   printf("=                  2.输出已创建的邻接矩阵                   =\n");

    printf("=                  3.输出可直达的路径                       =\n");

    printf("=                  4.输出最短路径的邻接矩阵                 =\n");

    printf("=                  5.退出操作                               =\n");

    printf("===================注意!!!不支持乱序选择===================\n");

    while(flag)

    {

       printf("\n    请选择菜单中的操作选项(第一次必须选择“”创建有向图!):\n");

       scanf("%d",&select);

       switch(select)

       {

       case1:

           Creat_Roadgraph(V);break;

       case2:

           Print_Roadgraph(V);break;

       case3:

           print_KDroad(V);break;

       case4:

           print_Shortest_Roadgraph(V);break;

       case5:

           flag=0;break;

        default:

           printf("您输入的数据有误!!!请重新输入!!!\n");

       }

 

    }

   

}

 

 

 

0 0
原创粉丝点击