1.建立图的存储结构(邻接矩阵或邻接表),能够输入图的顶点、边、以及边上的权值的信息,存储到相应的存储结构中,并输出图的结构。
2.求图的最小代价生成树
int CreateGraph(MGraph& G) {
//创建无向网的邻接矩阵
int v1,v2,w; //邻接两点v1,v2,以及所构成边的权值w
printf("请输入顶点数和边数:");
scanf("%d%d", &G.vexnum, &G.arcnum);
for (int i = 0; i < G.vexnum; ++i){
//构造顶点向量
printf("请输入第%d个顶点的值:",i+1);
scanf("%d", &G.vexs[i]);
}
for (int i = 0; i < G.vexnum; ++i){
//初始化邻接矩阵, 将各边的权值都赋值为 INT_MAX
for (int j = 0; j < G.vexnum; ++j)
G.arcs[i][j]= INFINITY ;
}
for (int k = 0; k < G.arcnum; ++k) {
//构造邻接矩阵
printf("请输入相邻两点的值,以及他们所构成边的权值:");
scanf("%d%d%d", &v1, &v2, &w);
int i = LocateVex(G, v1);
int j = LocateVex(G, v2);
G.arcs[i][j]= w;
G.arcs[j][i] = G.arcs[i][j]; //无向网邻接矩阵对称
}
return 0;
}
邻接矩阵:
邻接矩阵可以用一个二维数组来表示一个图。对于一个具有n个节点的无向图,我们可以定义一个n×n的矩阵,矩阵中的每一个元素表示一个节点与另一个节点之间边的存在情况。
如果存在一条边,则该元素为1;如果不存在,则该元素为0。如果该图存在边的方向,则该矩阵为一个n×m的矩阵,其中n和m分别表示图中的节点数和边数。
例如,下面的矩阵表示了一个由5个节点组成的无向图:
0 1 2 3 4 0 0 1 0 1 0 1 1 0 1 0 1 2 0 1 0 1 0 3 1 0 1 0 0 4 0 1 0 0 0
矩阵中的第i行和第j列交点处的元素表示从节点i到节点j是否存在一条边。该矩阵是对称的,即如果存在从节点i到节点j的边,则也存在从节点j到节点i的边。
构造邻接矩阵的代码:
// 构造邻接矩阵 int matrix[MAX_NODES][MAX_NODES]; memset(matrix, 0, sizeof(matrix));
// 将节点之间的边加入邻接矩阵 for (int i = 0; i < num_edges; i++) { int start = edges[i].start; int end = edges[i].end; int weight = edges[i].weight; matrix[start][end] = weight; matrix[end][start] = weight; // 对称的 }
邻接表:
邻接表是一种常见的图的表示方法,它将每个节点及其出边放入一个链表中,并通过其头指针来索引每个链表。对于有n个节点的无向图,它的邻接表可以定义为一个有n个指针的数组,数组中的每个元素都指向一个链表,包含从该节点出发的所有边。
例如,下面是一个由5个节点组成的无
《算法精解(C语言描述)》