int n, m, x, y, z, idx; int h[N], ed[N], nxt[N], val[N], dis[N]; bool vis[N];
voidadd(int a, int b, int c) { ed[idx] = b; val[idx] = c; nxt[idx] = h[a]; h[a] = idx++; }
intdijkstra() { memset(dis, 0x3f, sizeof dis); dis[1] = 0; for (int i = 1; i <= n; i++) { int t = -1; for (int j = 1; j <= n; j++) if (!vis[j] && (t == -1 || dis[j] < dis[t])) t = j; vis[t] = true; //遍历t能到达的所有点,其余的保留原值即可(不用遍历到) for (int j = h[t]; j != -1; j = nxt[j]) { int v = val[j]; //边的权重 int p = ed[j];//邻居节点 if (!vis[p]) dis[p] = min(dis[p], dis[t] + v); } } if (dis[n] == 0x3f3f3f3f) return-1; else return dis[n]; }
intmain() { ios::sync_with_stdio(0); cin.tie(0); memset(h, -1, sizeof h); cin >> n >> m; while (m--) { cin >> x >> y >> z; add(x, y, z); } int ans = dijkstra(); cout << ans << endl; return0; }
int n, m, x, y, z, idx; int h[N], ed[N], nxt[N], w[N], dis[N]; bool vis[N];
voidadd(int x, int y, int z) { ed[idx] = y; w[idx] = z; nxt[idx] = h[x]; h[x] = idx++; }
intdijkstra() { memset(dis, 0x3f, sizeof dis); dis[1] = 0; //距离 点号 q.push({0, 1}); while (!q.empty()) //当发现到某个节点的更短路径时,我们会重新将该节点加入队列 //,不同于数组的更新,所以不能用n次循环来代替!q.empty() { auto t = q.top(); q.pop(); int distance = t.first, p = t.second; //同一个点在没被标记(最短路)之前可能由别的节点扩展,写上这行避免重复处理同一个点(效率较高) if (vis[p]) continue; vis[p] =true;//p这个点的距离已经是最优,标记上 for (int j = h[p]; j != -1; j = nxt[j]) { int px = ed[j]; int wx = w[j]; if (dis[px] > distance + wx) { dis[px] = distance + wx; q.push({dis[px], px}); } } } if (dis[n] == 0x3f3f3f3f) return-1; return dis[n]; }
intmain() { ios::sync_with_stdio(0); cin.tie(0); memset(h, -1, sizeof h); cin >> n >> m; while (m--) { cin >> x >> y >> z; add(x, y, z); } int ans = dijkstra(); cout << ans << endl; return0; }