C:求图的中心顶点:【基本要求】 (1)建立一个顶点数不超过20的带权图; (2)求出图中各顶点间的最短路径,并输出; (3)求出每个顶点到其余各顶点中的最短路径,并输出; (4)求出图的中心顶点并输出。
时间: 2024-01-11 21:04:54 浏览: 16
好的,我了解您的问题,下面是一个 C 语言实现的求解图的中心顶点的代码。假设图的顶点数不超过 20。
```c
#include <stdio.h>
#include <limits.h>
#define MAX_VERTICES 20
#define INF INT_MAX
int dist[MAX_VERTICES][MAX_VERTICES];
// 使用 Floyd 算法计算任意两个顶点之间的最短路径
void floyd(int n) {
int i, j, k;
// 初始化 dist 数组
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (i == j) {
dist[i][j] = 0;
} else {
dist[i][j] = INF;
}
}
}
// 读入边权
int u, v, w;
while (scanf("%d %d %d", &u, &v, &w) == 3) {
dist[u][v] = w;
dist[v][u] = w; // 如果是无向图,需要将 dist[v][u] 也设置为 w
}
// 使用 Floyd 算法计算任意两个顶点之间的最短路径
for (k = 0; k < n; k++) {
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (dist[i][j] > dist[i][k] + dist[k][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
}
}
// 求出每个顶点到其余各顶点中的最短路径,并输出
void print_shortest_paths(int n) {
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("Shortest path from %d to %d is %d\n", i, j, dist[i][j]);
}
}
}
// 求出图的中心顶点并输出
void print_center_vertex(int n) {
int i, j, max, min_max;
min_max = INF;
for (i = 0; i < n; i++) {
max = 0;
for (j = 0; j < n; j++) {
if (dist[i][j] > max) {
max = dist[i][j];
}
}
if (max < min_max) {
min_max = max;
}
}
printf("The center vertex is:");
for (i = 0; i < n; i++) {
max = 0;
for (j = 0; j < n; j++) {
if (dist[i][j] > max) {
max = dist[i][j];
}
}
if (max == min_max) {
printf(" %d", i);
}
}
printf("\n");
}
int main() {
int n;
printf("Enter the number of vertices:\n");
scanf("%d", &n);
printf("Enter the edges and weights:\n");
floyd(n);
// 求出图中各顶点间的最短路径,并输出
print_shortest_paths(n);
// 求出图的中心顶点并输出
print_center_vertex(n);
return 0;
}
```
上面的代码中,我们使用 Floyd 算法计算任意两个顶点之间的最短路径,然后求出每个顶点到其余各顶点中的最短路径,并输出。最后,我们使用一些简单的代码来求出图的中心顶点并输出。
阅读全文