【数据结构】最短路径
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");
}
}
}
#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");
}
}
}
相关文章推荐
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构揭秘一
- 数据结构之Treap详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)
- java数据结构和算法学习之汉诺塔示例
- Java数据结构及算法实例:三角数字
- Java数据结构之简单链表的定义与实现方法示例
- 数据结构之AVL树详解
- qqwry.dat的数据结构图文解释第1/2页
- JavaScript中数据结构与算法(五):经典KMP算法