初学者。如果有误请指正,欢迎联系QQ2684162190
#include<stdio.h>
#include<stdlib.h>
#define INFIN 65535
#define MAX_VERTEX_NUM 20
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=INFIN;
G.arcs[0][1].adj=5;
G.arcs[2][0].adj=8;
G.arcs[0][3].adj=7;
G.arcs[5][0].adj=3;
G.arcs[1][2].adj=4;
G.arcs[3][2].adj=5;
G.arcs[4][3].adj=5;
G.arcs[5][4].adj=1;
G.arcs[3][5].adj=6;
G.arcs[2][5].adj=9;
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_DJT(int p[][6],MGraph &G,int v0,int D[])
{
//有向网G到的v0顶点到其余顶点V的最短路径p[v]及其带权志长度D【v】
//若p[v][w]为1则w是v0到v当前求得最短路径上的顶点
//final【v】为 当且仅当属于S即已经求得从v0到v的最短路径
int v,w,min,i;
for(v=0;v<G.vexnum;v++)
{
final[v] = 0;
D[v] = G.arcs[v0][v].adj;
for(w=0;w<G.vexnum;w++)
p[v][w]=0; //设置空路径
if(D[v]<65535)
{
p[v][v0]=1; //v0是v0到v最短路径上的点
p[v][v]=1; //v是v0到v最短路径上的点
}
}
D[v0] = 0; //v0属于S集
final[v0]=1;
//开始主循环,每次求得v0到某个顶点的最短路径并增加v到s集
for(i = 1;i<G.vexnum;i++)
{
min = 65535;
for(w=0;w<G.vexnum;w++) //w顶点距离v0顶点更近
if(!final[w])
if(D[w]<min)
{
v=w;
min = D[w];
}
final[v]=1; //距离v0最近的v顶点加入s集
for(w=0;w<G.vexnum;w++) //更新当前最短路径及距离
if(!final[w]&&(min+G.arcs[v][w].adj<D[w]))
{
D[w]=min+G.arcs[v][w].adj;
*p[w]=*p[v];
p[w][w]=1;
}
}
}
int main()
{
MGraph *G=(MGraph*)malloc(sizeof(MGraph));
CreateGraph(*G);
int p[6][6],D[6];
int v0=0;
shortPath_DJT(p,*G,v0,D);
int m;
printf("输入要查找从v0到第几个点<6\n");
scanf("%d",&m);
printf("最短路径是%d\n",D[m]);
int i;
for(i=0;i<G->vexnum;i++)
{
if(p[m][i]==1)
printf("%c",G->vexs[i]);
}
}