第十一周周任务
非负权单源最短路 描述 给一个n( 1 <= n <= 2500 )个点,m条边( 1 <= m <= 6200 ) 的无向图,求s到t的最短路。 输入 第一行四个由空格隔开的整数 n、m、s、t。之后的m行,每行三个正整数 s[i]、t[i]、wi,表示一条从s[i]到t[i]长度为w[i]的边。 输出 一个整数表示从s到t的最短路长度。数据保证至少存在一条道路。 输入样例 7 11 5 4 2 4 2 1 4 3 7 2 2 3 4 3 5 7 5 7 3 3 6 1 1 6 3 4 2 4 3 5 6 3 7 2 1 输出样例 7
AC代码:
#include <bits/stdc++.h> using namespace std; int cost[3000][3000]; int d[2505]; int vis[2505]; int main() { memset(cost ,0x3f ,sizeof(cost)); memset(vis, 0, sizeof(vis)); int n, m, s, t; scanf("%d%d%d%d", &n, &m, &s, &t); for (int i = 0; i < m; i++) { int s0, t0, w0; scanf("%d%d%d", &s0, &t0, &w0); cost[s0][t0] = min(cost[s0][t0], w0); cost[t0][s0] = min(cost[t0][s0], w0); } memset(d, 0x3f, sizeof(d)); d[s] = 0; while (1) { int v = -1; for (int i = 1; i <= n; i++) { if (vis[i]==0 && (v==-1||d[i]<d[v])) v = i; } if (v==-1) break; vis[v] = 1; for (int i = 1; i <= n; i++) d[i] = min(d[i], d[v]+cost[v][i]); } printf("%d", d[t]); return 0; }