初学者。如果有误请指正,欢迎联系QQ2684162190
#include<stdio.h>
#include<stdlib.h>
#define INFINITY 65535
#define MAX_VERTEX_NUM 6
#define TRUE 1
int final[6];
typedef enum{DG,DN,UDG,UDN}GraphKind; //有向图,有向网,无向图,无向网
typedef struct ArcCell
{
int adj; //顶点的关系类型
int *info=NULL; //弧的相关信息指针
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct{
char vexs[MAX_VERTEX_NUM]; //顶点向量
AdjMatrix arcs; //邻接矩阵
int vexnum,arcnum; //图当前顶点数与弧数
GraphKind kind; //图种类标志
}MGraph;
int CreateDG(MGraph &G)
{
return 0;
}
int CreateDN(MGraph &G)
{
return 0;
}
int CreateUDG(MGraph &G)
{
return 0;
}
int LocateVex(MGraph &G,char v)
{
int i;
for(i=0;i<G.vexnum;i++)
{
if(v==G.vexs[i])
return i;
}
if(i==G.vexnum)
return 65535;
}
int CreateUDN(MGraph &G)
{
// printf("输入顶点数(按enter结束):");
// scanf("%d",&G.vexnum); //存储顶点数与弧数
// getchar();
// printf("输入弧数(按enter结束):");
// scanf("%d",&G.arcnum);
// getchar();
// printf("输入顶点信息(char):");
// int i,j;
// for(i=0;i < G.vexnum;i++) //构造顶点向量
// scanf("%c",&G.vexs[i]);
// getchar();
// for(i=0;i<G.vexnum;i++)
// for(j=0;j < G.vexnum;j++)
// G.arcs[i][j].adj=INFIN;
// char v1,v2;
// int w;
// printf("输入依附于一条边的顶点与权值v1,v2,w:");
//
// for(int k=0;k<G.arcnum;k++)
// {
// scanf("%c%c%d",&v1,&v2,&w);
// i=LocateVex(G,v1); //寻找v1在G中的位置
// j=LocateVex(G,v2);
// G.arcs[i][j].adj=w;
// G.arcs[j][i].adj=G.arcs[i][j].adj; //对称赋值
// }
G.vexnum = 6;
G.arcnum = 10;
int i,j;
for(i=0;i<G.vexnum;i++)
{
G.vexs[i]=(char)'a'+i;
}
for(i=0;i<G.vexnum;i++)
for(j=0;j < G.vexnum;j++)
G.arcs[i][j].adj=INFINITY;
G.arcs[0][1].adj=6;G.arcs[1][0].adj=6;
G.arcs[2][0].adj=1;G.arcs[0][2].adj=1;
G.arcs[0][3].adj=5;G.arcs[3][0].adj=5;
G.arcs[1][2].adj=5;G.arcs[2][1].adj=5;
G.arcs[3][2].adj=5;G.arcs[2][3].adj=5;
G.arcs[4][1].adj=3;G.arcs[1][4].adj=3;
G.arcs[4][2].adj=6;G.arcs[2][4].adj=6;
G.arcs[5][4].adj=6;G.arcs[4][5].adj=6;
G.arcs[3][5].adj=2;G.arcs[5][3].adj=2;
G.arcs[2][5].adj=4;G.arcs[5][2].adj=4;
return 1;
}
int CreateGraph(MGraph &G)
{
// printf("输入图的类型(0,1,2,3):");
// scanf("%d",&G.kind); //修改图的类型
G.kind=UDN;
switch(G.kind)
{
case DG:return CreateDG(G);
case DN:return CreateDN(G);
case UDN:return CreateUDN(G);
case UDG:return CreateUDG(G);
default :return 0;
}
}
void shortPath_FLOYD(int (*P)[MAX_VERTEX_NUM][MAX_VERTEX_NUM],MGraph &G,int D[][MAX_VERTEX_NUM])
{
//用floyd算法求有向网G中各队顶点v到w之间的最短路径P[v][w]及其
//带权长度D[v][w]。若p[v][w][u]为TRUE,则u是从V到W当前求得最短路径上的点
int v,w,u,i; //对各个节点之间,初始化一致路径及距离
for(v = 0;v < G.vexnum;v++)
for(v = 0;v < G.vexnum; ++v)
{
for(w = 0;w < G.vexnum;++w)
{
D[v][w] = G.arcs[v][w].adj;
for( u = 0;u < G.vexnum;u++)
P[v][w][u] = 0;
if(D[v][w] < INFINITY)
{
P[v][w][v] = TRUE; //从V到W的有直接路径 v是从V到W当前求得最短路径上的点
P[v][w][w] = TRUE;
}
}
}
for(u = 0;u < G.vexnum;u++)
for(v = 0;v < G.vexnum;v++)
for(w = 0;w < G.vexnum;w++)
if(D[v][u]+D[u][w] < D[v][w])
{
D[v][w] = D[v][u]+D[u][w];
for(i = 0;i < G.vexnum;i++)
P[v][w][i] = P[u][w][i];
}
}
void result(int D[][6],int (*p)[6][6],int m,int n,MGraph &G)
{
int i,temp = 0,d=m;
printf("从%d到%d的最短路径上的点为:",m,n);
for(i = 0;i<G.vexnum;i++)
D[i][i] = 0;
for(i = 0;i<6;i++)
{
if(p[m][n][i]==1)
{
printf("%c ",G.vexs[i]);
temp+=D[d][i];
d = i;
}
}
printf("\n最短路径为%d",temp);
}
int main()
{
MGraph *G=(MGraph*)malloc(sizeof(MGraph));
CreateGraph(*G);
int (*p)[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int D[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
shortPath_FLOYD(p,*G,D);
printf("输入求那两个顶点(只有6个顶点)的最短距离");
int m,n;
scanf("%d%d",&m,&n);
if(m>=6||n>=6)
{
printf("error");
return 0;
}
result(D,p,m,n,*G);// 输出结果
}