Dijkstra priority_queue优化

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 1e5 + 10;
const ll inf = (ll)1e16;

int n, m;
bool vis[N];
ll dis[N];
vector <pii> g[N];

struct Node{
    
    
	int id; ll d;
	Node() {
    
    }
	Node(int id, ll d):id(id),d(d){
    
    }
	bool operator < (const Node &A) const {
    
    
		return d > A.d;
	}
};

void dijkstra(int st){
    
    
	for(int i=1; i<=n; i++){
    
    
		vis[i] = 0;
		dis[i] = inf;
	}

	dis[st] = 0;
	priority_queue <Node> Q;
	Q.push(Node(st, 0));
	Node nd;

	while(!Q.empty()){
    
    
		nd = Q.top(); Q.pop();
		if(vis[nd.id]) continue;
		vis[nd.id] = true;
		for(int i=0; i<g[nd.id].size(); i++){
    
    
			int j = g[nd.id][i].first;
			int k = g[nd.id][i].second;
			if(nd.d + k < dis[j] && !vis[j]){
    
    
				dis[j] = nd.d + k;
				Q.push(Node(j, dis[j]));
			}
		}
	}
}

int main(){
    
    
	int x, y, z, st, ed, cas = 0;
	scanf("%d", &cas);
	while(cas--){
    
    
		scanf("%d%d%d", &n, &m, &st);
		for(int i=1; i<=n; i++) g[i].clear();
		while(m--){
    
    
			scanf("%d%d%d", &x, &y, &z);
			g[x].push_back(make_pair(y, z));
			//g[y].push_back(make_pair(x, z));
		}
		dijkstra(st);
		for(int i=1; i<=n; i++)
			printf("%d%s", dis[i], " \n"[i==n]);
	}
}

引自:https://blog.csdn.net/scar_halo/article/details/82825418

Guess you like

Origin blog.csdn.net/YingShen_xyz/article/details/108884491