堆优化的dij
先放代码去瞅一眼牛客网比赛qwq
1 #include<queue> 2 #include<cstdio> 3 #include<iostream> 4 using namespace std; 5 const int maxn = 100010, maxm = 500020, inf = 1<<30; 6 int num = 0, n, m, s; 7 int head[maxm], dis[maxn]; 8 bool vis[maxn]; 9 priority_queue< pair<int, int> >q; 10 struct edge { 11 int nxt, to, dis; 12 }e[maxm<<1]; 13 int read() { 14 char ch = getchar(); int x = 0, f = 1; 15 while(ch<'0'||ch>'9') {if(ch == '-') f = -1;ch = getchar();} 16 while(ch>='0'&&ch<='9') {x = x*10+ch-'0'; ch = getchar();} 17 return x*f; 18 } 19 void add(int from, int to, int dis) { 20 e[++num].nxt = head[from]; 21 e[num].to = to; 22 e[num].dis = dis; 23 head[from] = num; 24 } 25 void dijkstra() { 26 for(int i = 1; i <= n; i++) { 27 dis[i] = inf; 28 vis[i] = 0; 29 } 30 // vis[s] = 1; 31 dis[s] = 0; 32 q.push(make_pair(0, s)); 33 while(q.size()) { 34 int u = q.top().second; 35 q.pop(); 36 if(vis[u]) continue; 37 vis[u] = 1; 38 for(int i = head[u]; i; i = e[i].nxt) { 39 int v = e[i].to; 40 if(dis[v] > dis[u]+e[i].dis) { 41 dis[v] = dis[u]+e[i].dis; 42 q.push(make_pair(-dis[v], v)); 43 } 44 } 45 } 46 } 47 48 int main() { 49 scanf("%d%d%d", &n, &m, &s); 50 for(int i = 1; i <= m; i++) { 51 int f, g, k; 52 f = read(), g = read(), k = read(); 53 add(f, g, k); 54 } 55 dijkstra(); 56 for(int i = 1; i <= n; i++) 57 printf("%d ", dis[i]); 58 return 0; 59 }
如果把起点初始为1,已经访问过就直接结束了QAQ 和spfa不一样!!
第42行, 放进堆里的是dis[v] 的相反数, 因为priority_queue初始大根堆, 这样就不用重定义小根堆了qwq