struct edge{
int to, cost;//若u到v有条边,边权为w,则u.to -> v, u.cost -> w
};
vector<edge> G[maxn];
int d[maxn];
int n, m;
void dij(int s){
priority_queue<PII, vector<PII>, greater<PII>> q;//优先队列
for(int i = 1;i <= n;i++) d[i] = inf;
d[s] = 0;
q.push(PII(0, s));
while(!q.empty()){
PII p = q.top();//p.first为最短路径,p.second为s到这个点的点
q.pop();
if(d[p.second] < p.first) continue;
int len = G[p.second].size();
for(int i = 0;i < len;i++){
edge e = G[p.second][i];
if(d[e.to] > d[p.second] + e.cost){
d[e.to] = d[p.second] + e.cost;//松弛
q.push(PII(d[e.to], e.to));
}
}
}
}
最短路(dij堆优化)
最新推荐文章于 2023-08-09 12:12:37 发布