用c语言编写Input 多组测试数据,对于每组数据, 第一行是两个整数,分别表示节点的数目M和边的数目N。 从第二行至第M+1行,每行三个整数,start, end, value. 分别表示节点start,end之间有一条长度为value.的边。 (M, N, start, end, value < 100) Output 对于每组输入数据,输出最小生成树的各边。 Sample Input 3 3 1 2 1 2 3 2 1 3 4 Sample Output (1,2)(2,3)
时间: 2024-03-22 09:39:08 浏览: 164
好的,我理解了你的要求。下面是用 C 语言编写的完整代码:
```c
#include<stdio.h>
#include<stdlib.h>
#define MAXN 100
#define INF 0x3f3f3f3f
int n, m;
int g[MAXN][MAXN]; // 存储图的邻接矩阵
int d[MAXN]; // 存储每个节点到生成树的最小距离
int vis[MAXN]; // 标记每个节点是否已经加入生成树
int ans[MAXN][2]; // 存储最小生成树的边
int prim()
{
int i, j, k;
int min, min_idx;
int sum = 0;
// 初始化 d 数组和 vis 数组
for (i = 1; i <= n; i++) {
d[i] = INF;
vis[i] = 0;
}
d[1] = 0;
for (i = 1; i <= n; i++) {
min = INF;
// 找到离生成树最近的节点
for (j = 1; j <= n; j++) {
if (!vis[j] && d[j] < min) {
min = d[j];
min_idx = j;
}
}
vis[min_idx] = 1;
// 将该节点加入生成树
if (i != 1) {
ans[i-2][0] = k;
ans[i-2][1] = min_idx;
}
sum += d[min_idx];
// 更新与该节点相邻的节点的距离
for (k = 1; k <= n; k++) {
if (!vis[k] && g[min_idx][k] < d[k]) {
d[k] = g[min_idx][k];
}
}
}
return sum;
}
int main()
{
int i, j, u, v, w;
while (scanf("%d%d", &n, &m) != EOF) {
// 初始化邻接矩阵
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
g[i][j] = INF;
}
}
// 读入边
for (i = 0; i < m; i++) {
scanf("%d%d%d", &u, &v, &w);
g[u][v] = g[v][u] = w;
}
// 求解最小生成树
int sum = prim();
// 输出最小生成树的边
for (i = 0; i < n-1; i++) {
printf("(%d,%d)", ans[i][0], ans[i][1]);
}
printf("\n");
}
return 0;
}
```
这个程序使用 Prim 算法求解最小生成树,时间复杂度为 O(n^2)。在程序中,我们使用邻接矩阵存储图,并使用 d 数组和 vis 数组分别存储每个节点到生成树的最小距离和标记每个节点是否已经加入生成树。在求解最小生成树的过程中,我们使用了一个 ans 数组来存储最小生成树的边。
阅读全文