原题链接:说走就走的旅行
参考代码:
#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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复