给定院系之间的交通图。若院系i和j之间有路可通,则i和j用边连接,边上的权值Wij表示这条道路的长度。现某位校友打算以某个院系为起点,访问各个院系。采用Dijkstra算法完成以下要求:(院系之间为无向图,但所写算法对于其加强命题有向图也须成立): a. 找出该校友应该以那个院系为起点,才能使距离该校友最远的院系与他的距离最短; b. 找出该校友应该以那个院系为起点,才能使其他所有院系与他的距离综合最短。 提示: a. 对于第一个问题,可以先求出每个院系到其它所有院系的最短路径,保存其最大值(表示假设该校友在该院系,距离他最远的院系的路径长度);然后在这些最大值中找出一个最小值。 b. 对第二个问题,可以先求出每个院系到其它所有院系的最短路径,保存其累加和(表示假设该校友在该院系,其它所有院系距离他的路径总和);然后在这些和中找出一个最小值。用C语言实现
时间: 2024-02-28 09:54:44 浏览: 62
Maxim推出带有MTP存储器的可编程gamma和VCOM基准系统
以下是C语言实现Dijkstra算法解决上述问题的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_VERTICES 1000
#define INF INT_MAX
int graph[MAX_VERTICES][MAX_VERTICES];
int n, m;
void dijkstra(int s, int *dist) {
int i, j, u, min;
int visited[MAX_VERTICES] = {0};
for (i = 1; i <= n; i++) {
dist[i] = graph[s][i];
}
visited[s] = 1;
for (i = 2; i <= n; i++) {
min = INF;
for (j = 1; j <= n; j++) {
if (!visited[j] && dist[j] < min) {
min = dist[j];
u = j;
}
}
visited[u] = 1;
for (j = 1; j <= n; j++) {
if (!visited[j] && graph[u][j] < INF && dist[u] + graph[u][j] < dist[j]) {
dist[j] = dist[u] + graph[u][j];
}
}
}
}
int main() {
scanf("%d %d", &n, &m);
int i, j, u, v, w;
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
graph[i][j] = INF;
}
}
for (i = 1; i <= m; i++) {
scanf("%d %d %d", &u, &v, &w);
graph[u][v] = graph[v][u] = w;
}
int max_dist = 0, min_sum = INF, start1, start2;
int dist[MAX_VERTICES];
for (i = 1; i <= n; i++) {
dijkstra(i, dist);
int max_d = 0, sum = 0;
for (j = 1; j <= n; j++) {
if (dist[j] != INF) {
if (dist[j] > max_d) {
max_d = dist[j];
}
sum += dist[j];
}
}
if (max_d < max_dist) {
max_dist = max_d;
start1 = i;
}
if (sum < min_sum) {
min_sum = sum;
start2 = i;
}
}
printf("Start from %d for shortest distance to farthest vertex.\n", start1);
printf("Start from %d for shortest total distance to all vertices.\n", start2);
return 0;
}
```
代码中首先读入图的顶点数和边数,然后读入每条边的起点、终点和权值,构建邻接矩阵表示的无向图。接着,使用Dijkstra算法求出从每个顶点出发到其他所有顶点的最短路径,并计算出每个顶点到距离它最远的顶点的距离最小值以及所有顶点到它的距离之和的最小值,最后输出求解结果。
阅读全文