无向图(使用邻接矩阵)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
#include

#define MaxVertices 100 //假设包含100个顶点
#define MaxWeight 32767 //不邻接时为32767,但输出时用 "∞"

typedef struct //包含权的邻接矩阵的的定义
{ int Vertices[MaxVertices]; //顶点信息的数组
int Edge[MaxVertices][MaxVertices]; //边的权信息的数组
int numV; //当前的顶点数
int numE; //当前的边数
}AdjMatrix;


void main()
{ void CreateGraph(AdjMatrix*G);
void DispGraph(AdjMatrix G);
void Prim(AdjMatrix G); //最小生成树的普里姆算法;
AdjMatrix G;
CreateGraph(&G);
DispGraph(G);
Prim(G);
}

void CreateGraph(AdjMatrix*G) //图(带权)的产生函数(建立无(有)向图)
{ int n,e,vi,vj,w,i,j;
printf("请输入图的顶点数和边数(以空格分隔):");
scanf("%d%d",&n,&e);
G->numV=n;G->numE=e;
for(i=0;ifor(j=0;j{ if(i==j)
G->Edge[i][j]=0;
else
G->Edge[i][j]=32767;
}
for(i=0;ifor(i=0;inumV;i++) //将顶点存入数组中
{ printf("请输入第%d个顶点的信息(整型):",i+1);
scanf("%d",&G->Vertices[i]);
}
printf("\n");
for(i=0;inumE;i++)
{ printf("请输入边的信息i,j,w(以空格分隔):");
scanf("%d%d%d",&vi,&vj,&w); //建立有向图时只有此句
G->Edge[vi-1][vj-1]=w;
G->Edge[vj-1][vi-1]=w; //建立均向图片时要此句
}
}

void DispGraph(AdjMatrix G) //输出邻接矩阵的信息
{ int i,j;
printf("\n输出顶点的信息(整型):\n");
for(i=0;iprintf("%8d",G.Vertices[i]);
printf("\n输出邻接矩阵:\n");
printf(" ");
for(i=0;iprintf("%8d",G.Vertices[i]);
for(i=0;i{ printf("\n%8d",i+1);
for(j=0;j{ if(G.Edge[i][j]==32767) //无边时值为32767,但输出时为了方便输出 "∞"
printf("%8s", "∞");
else
printf("%8d",G.Edge[i][j]);
}
printf("\n");
}
}

typedef struct //定义最小生成树的带权边
{ int begin,end; //边的起点和终点
int weight; //边的权值
}MinSpanTree;

void Prim(AdjMatrix G) //最小生成树的普里姆算法
{ int n,j,k,v,min,m;
n=G.numV;
MinSpanTree e,mintree[100]; //mintree生成树数组
for(j=1;j{ mintree[j-1].begin=1; //将1并入U中
mintree[j-1].end=j+1;
mintree[j-1].weig

ht=G.Edge[0][j];
}
for(k=0;k{ min=MaxWeight;
for(j=k;jif(mintree[j].weight{ min=mintree[j].weight;m=j;}
e=mintree[m];mintree[m]=mintree[k];mintree[k]=e;
v=mintree[k].end;
for(j=k+1;j{ int d=G.Edge[v-1][mintree[j].end-1];
if(d{ mintree[j].weight=d;
mintree[j].begin=v;
}
}
}
printf("最小生成树为:");
for(j=0;jprintf("\ni=%d,j=%d,weight=%d",mintree[j].begin,mintree[j].end,mintree[j].weight);
printf("\n");
}

相关文档
最新文档