原题链接:说走就走的旅行
参考代码:
#include<stdio.h> #define True 1 #define False 0 #define MAXN 1001 #define MAXVAL 0xffff int map[MAXN][MAXN]; int dis[MAXN]; int Min(int a, int b); void InitMap(); void InitDis(int n); void Dijkstra(int v, int n); int main() { int T, S, D; int i, j, w; int init, aim, min; int start[MAXN]; while (scanf("%d%d%d", &T, &S, &D) != EOF) { int index[MAXN] = { 0 }; int k = 0; InitMap(); while (T--) { scanf("%d%d%d", &i, &j, &w); if (!index[i]) index[i] = ++k; if (!index[j]) index[j] = ++k; // 使顶点编号严格递增,便于遍历 if (w < map[index[i]][index[j]]) { // 可能有多条通路,取较小权值 map[index[i]][index[j]] = w; map[index[j]][index[i]] = w; // 无向/双向 } } i = 0; while (S--) { scanf("%d", &init); start[i++] = index[init]; // 先存放起点 } min = MAXVAL; while (D--) { scanf("%d", &aim); InitDis(k); Dijkstra(index[aim], k); for (j = 0; j < i; j++) { min = Min(min, dis[start[j]]); } } printf("%d\n", min); } return 0; } int Min(int a, int b) { return a < b ? a : b; } void InitMap() { for (int i = 0; i < MAXN; i++) { for (int j = 0; j < MAXN; j++) { map[i][j] = MAXVAL; } } } void InitDis(int n) { for (int i = 1; i <= n; i++) { dis[i] = MAXVAL; } } void Dijkstra(int v, int n) { int i, j, k, min; int visited[MAXN] = { False }; for (i = 1; i <= n; i++) { dis[i] = Min(dis[i], map[v][i]); } visited[i] = True; for (i = 2; i <= n; i++) { for (j = 1, min = MAXVAL; j <= n; j++) { if (visited[j] == False && min > dis[j]) { min = dis[j]; k = j; } } visited[k] = True; for (j = 1; j <= n; j++) { if (visited[j] == False && dis[j] > min + map[k][j]) { dis[j] = min + map[k][j]; } } } }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复