维护一个集合,集合中的元素与点u的最短距离已经确定,求出集合内元素所能到达的点到点u的距离,取最短的距离对应的点加入集合直到集合包含点v。
每次更新距离只与新加入集合的点有关。
#include <stdio.h> #include <string.h> #include <algorithm> #define N 1005 unsigned w[N][N]; int main(){ memset(w, -1, sizeof(w)); int n, m, u, v; scanf("%d%d%d%d", &n, &m, &u, &v); int from, to; unsigned weight; for (int i = 0; i < m; i++) { scanf("%d%d%u", &from, &to, &weight); weight = std::min(weight, w[from][to]); w[from][to] = w[to][from] = weight; } int min_idx; unsigned min; while (true) { min_idx = 1; min = w[u][1]; for (int i = 2; i <= n; i++) { if (min > w[u][i]) { min = w[u][i]; min_idx = i; } } for (int i = 1; i <= n; i++) { if (w[min_idx][i] != (unsigned)-1) { w[u][i] = std::min(w[u][i], w[u][min_idx] + w[min_idx][i]); } } if (min_idx == v) { break; } else { w[u][min_idx] = -1; } } printf("%u\n", w[u][v]); return 0; }
时间: 2024-10-25 20:56:56