分别用Prim算法和Kruskal算法实现最小生成树,要求用C语言实现
时间: 2024-05-13 21:19:35 浏览: 12
Prim算法实现最小生成树的C语言代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_VERTICES 1000
typedef struct {
int x;
int y;
} Point;
Point points[MAX_VERTICES];
int graph[MAX_VERTICES][MAX_VERTICES];
int visited[MAX_VERTICES];
int parent[MAX_VERTICES];
int dist[MAX_VERTICES];
int main() {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%d%d", &points[i].x, &points[i].y);
visited[i] = 0;
parent[i] = -1;
dist[i] = INT_MAX;
for (int j = 0; j < n; j++) {
graph[i][j] = 0;
}
}
for (int i = 0; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
u--;
v--;
int dx = points[u].x - points[v].x;
int dy = points[u].y - points[v].y;
int w = dx * dx + dy * dy;
graph[u][v] = w;
graph[v][u] = w;
}
int start = 0;
dist[start] = 0;
for (int i = 0; i < n; i++) {
int u = -1;
for (int j = 0; j < n; j++) {
if (!visited[j] && (u == -1 || dist[j] < dist[u])) {
u = j;
}
}
visited[u] = 1;
for (int v = 0; v < n; v++) {
if (graph[u][v] > 0 && graph[u][v] < dist[v]) {
parent[v] = u;
dist[v] = graph[u][v];
}
}
}
int total_weight = 0;
for (int i = 0; i < n; i++) {
if (parent[i] != -1) {
total_weight += graph[i][parent[i]];
}
}
printf("%d\n", total_weight);
return 0;
}
```
Kruskal算法实现最小生成树的C语言代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_VERTICES 1000
#define MAX_EDGES 1000000
typedef struct {
int x;
int y;
} Point;
Point points[MAX_VERTICES];
int parent[MAX_VERTICES];
int rank[MAX_VERTICES];
int edges[MAX_EDGES][3];
int find(int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]);
}
return parent[x];
}
void unite(int x, int y) {
int px = find(x);
int py = find(y);
if (rank[px] < rank[py]) {
parent[px] = py;
} else {
parent[py] = px;
if (rank[px] == rank[py]) {
rank[px]++;
}
}
}
int compare_edge(const void *p, const void *q) {
int *a = (int*) p;
int *b = (int*) q;
return a[2] - b[2];
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%d%d", &points[i].x, &points[i].y);
parent[i] = i;
rank[i] = 0;
}
for (int i = 0; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
u--;
v--;
int dx = points[u].x - points[v].x;
int dy = points[u].y - points[v].y;
int w = dx * dx + dy * dy;
edges[i][0] = u;
edges[i][1] = v;
edges[i][2] = w;
}
qsort(edges, m, sizeof(int[3]), compare_edge);
int total_weight = 0;
for (int i = 0; i < m; i++) {
int u = edges[i][0];
int v = edges[i][1];
int w = edges[i][2];
if (find(u) != find(v)) {
unite(u, v);
total_weight += w;
}
}
printf("%d\n", total_weight);
return 0;
}
```