Dijkstra算法时间复杂度(mlogn)
#include <iostream> #include <string> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <queue> #include <functional> #include <map> #include <set> #include <stack> #define FT(a, b) memset(a, b, sizeof(a)) #define FAT(a) memset(a, 0, sizeof(a)) using namespace std; typedef long long ll; const int M = 1e5 + 10; const int INF = 0x3f3f3f3f; struct node { int a, d; bool operator<(const node &x) const { return x.d < d; } }; priority_queue<node> q; int n, m, dis[M], e[M], ne[M], h[M], w[M], idx; bool vis[M]; void add(int a, int b, int c) { e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++; } void dijkstra() { FT(dis, INF); FAT(vis); dis[1] = 0; q.push({1, 0}); node n1; while (!q.empty()) { n1 = q.top(); q.pop(); if (!vis[n1.a]) { vis[n1.a] = 1; for (int i = h[n1.a]; i != -1; i = ne[i]) { int j = e[i]; if (dis[j] > n1.d + w[i]) { dis[j] = n1.d + w[i]; q.push({j, dis[j]}); } } } } } int main() { #ifdef ONLINE_JUDGE #else freopen("f:\\code\\c++\\in.txt", "r", stdin); #endif while (~scanf("%d%d", &n, &m)) { FT(h, -1); idx = 0; for (int i = 0; i < m; i++) { int a, b, c; scanf("%d%d%d", &a, &b, &c); add(a, b, c); } dijkstra(); printf("%d\n", dis[n]==INF?-1:dis[n]); } return 0; }
原文:https://www.cnblogs.com/ignorance/p/12096112.html