您的位置:首页 > 理论基础 > 数据结构算法

【数据结构】最短路径

2015-11-08 22:36 381 查看
#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");
       }
 
    }
   
}
 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息