专题四 · 1011

来源:互联网 发布:2017淘宝捉猫猫怎么玩 编辑:程序博客网 时间:2024/05/29 04:44

代码及解释

#include <algorithm>#include <limits.h>#include <stdio.h>#include <string.h>// 最后一道 ACM 题// 死活 A 不过去// 然后我就看了别人的代码 A 了// _:(´°ω°`」 ∠):_const int SIZE = 2000;int T, S, D, n;int map[SIZE][SIZE];int vis[SIZE], cast[SIZE];int s[SIZE], e[SIZE];void Dijkstra() {  int i, j, minn, pos = 0;  memset(vis, 0, sizeof(vis));  vis[0] = 1;  for (i = 0; i <= n; i++)    cast[i] = map[0][i];  for (i = 1; i <= n; i++) {    minn = INT_MAX;    for (j = 1; j <= n; j++) {      if (cast[j] < minn && !vis[j]) {        pos = j;        minn = cast[j];      }    }    vis[pos] = 1;    for (j = 1; j <= n; j++) {      if (cast[pos] + map[pos][j] < cast[j] && !vis[j])        cast[j] = cast[pos] + map[pos][j];    }  }}int main() {  int i, j, x, y, z;  while (~scanf("%d%d%d", &T, &S, &D)) {    n = 0;    for (i = 0; i < SIZE; i++) {      for (j = 0; j < SIZE; j++)        map[i][j] = INT_MAX;      map[i][i] = 0;    }    while (T--) {      scanf("%d%d%d", &x, &y, &z);      n = std::max(std::max(n, x), y);      if (z < map[x][y])        map[x][y] = map[y][x] = z;    }    int minn = INT_MAX;    for (i = 0; i < S; i++) {      scanf("%d", &s[i]);      map[0][s[i]] = map[s[i]][0] = 0;    }    for (i = 0; i < D; i++)      scanf("%d", &e[i]);    Dijkstra();    for (i = 0; i < D; i++)      minn = std::min(minn, cast[e[i]]);    printf("%d\n", minn);  }  return 0;}
0 0