课程设计所有顶点最短路径问题,下面是邻接矩阵的建立,请帮忙把弗洛伊德算法加进去并输出所有顶点最短路径。
请大家帮忙,遇到麻烦问题了,课程设计所有顶点最短路径问题(图的应用)下面是邻接矩阵的建立,请帮忙把弗洛伊德算法加进去并输出所有顶点最短路径。谢谢帮忙了。
#include<stdio.h>
#include<stdlib.h>
#define max 20 //最多顶点个数
#define infinity 0 //表示极大值
int inf=32767;
int *p;
////////////////////////////////////////////////
typedef enum {DG,DN,UDG,UDN}GraphKind;
//图的种类:有向图,有向网,无向图,无向网
typedef int VertexData;//字符型顶点数据
typedef struct
{
int adj;//无权图用1或0表示,带权图用权值类型
}ArcNode;
typedef struct
{
VertexData vexs[max];//顶点向量
ArcNode arcs[max][max];//邻接矩阵
int vexnum,arcnum;//图的顶点数和弧数
int Graphkind;//图的种类标志
}AdjMatrix;//邻接矩阵
/////////////////////////////////////////////////
//函数声明表
void Print(AdjMatrix *Net);
void Choose(int choice,AdjMatrix *Net);
int CreateDN(AdjMatrix *Net);
int LocateVex(AdjMatrix *Net,VertexData v);
void PrintDN(AdjMatrix *Net);
void Floyed(int cost[][max],int n);
/////////////////////////////////////////////////
//主函数
int main()
{
//定义和初始化
AdjMatrix Net;
Net.vexnum=0;
Net.arcnum=0;
Net.Graphkind;
system("color a");
Print(&Net);
while(true)
{
printf("Press enter to continue.........");
getchar();
getchar();
system("cls");
Print(&Net);
}
return 0;
}
///////////////////////////////////////////////////
//菜单函数
void Print(AdjMatrix *Net)
{
int choice;
printf("---------------------\n");
printf("使用说明:本程序可实现邻接矩阵法创建有向网.\n");
printf("---------------------\n");
printf("1.新建一个有向网.\n");
printf("2.输出当前有向网.\n");
printf("3.求图中某顶点的位置.\n");
printf("5.用弗洛伊德算法求最短路径.\n");
printf("4.按其它任意键退出.\n");
printf("---------------------\n");
printf("请选择你要的操作:");
scanf("%d",&choice);
Choose(choice,Net);
}
//////////////////////////////////////////////////
//菜单选择执行函数
void Choose(int choice,AdjMatrix *Net)
{
int temp;
switch(choice)
{
case 1:
if(CreateDN(Net))
printf("创建有向网成功!\n");
else
{
break;
printf("创建有向网失败\n");
}se 2:
PrintDN(Net);
break;
case 3:
printf("请输入顶点数据:");
scanf("%d",&temp);
printf("该顶点位置为:%d\n",LocateVex(Net,temp));
break;
case 5:
p=(int *)Net->arcs;
Floyed(p,20);
break;
default:
exit(0);
}
}
//////////////////////////////////////////////////
//创建一个有向网
int CreateDN(AdjMatrix *Net)
{
int i,j,k;
int weight;
VertexData v1,v2;
printf("请输入图的顶点数和弧数:");
scanf("%d%d",&Net->vexnum,&Net->arcnum);
//初始化邻接矩阵
for(i=0;i<Net->vexnum;i++)
for(j=0;j<Net->vexnum;j++)
Net->arcs[i][j].adj=infinity;
printf("请输入图的顶点:\n");
for(i=0;i<Net->vexnum;i++)
scanf("%d",&Net->vexs[i]);
printf("请输入一条弧的两个顶点及权值:\n");
for(k=0;k<Net->arcnum;k++)
{
scanf("%d%d%d",&v1,&v2,&weight);
i=LocateVex(Net,v1);
j=LocateVex(Net,v2);
if(i<0 || j<0)
return false;
Net->arcs[i][j].adj=weight;//建立弧
}
return true;
}
////////////////////////////////////////////////////////
//求顶点位置函数
int LocateVex(AdjMatrix *Net,VertexData v)
{
int k;
for(k=0;k<Net->vexnum;k++)
if(Net->vexs[k]==v){
return k;
};
return -1;//没找到,返回-1
}
///////////////////////////////////////////////////////
//输出有向图
void PrintDN(AdjMatrix *Net)
{
int i,j;
printf("顶点:\n");
for(i=0;i<Net->vexnum;i++)
printf("%d ",Net->vexs[i]);
printf("\n");
printf("邻接矩阵:(0代表无穷大)\n");
for(i=0;i<Net->vexnum;i++){
for(j=0;j<Net->vexnum;j++)
printf("%d ",Net->arcs[i][j]);
printf("\n");
}
}
///////////////////////////////////////////////////////