【模板】堆优化 + dij +pair 存储

时间:2023-03-09 08:46:14
【模板】堆优化 + dij +pair 存储

就是短

感谢Cptraserdalao的博客

 #include<bits/stdc++.h>
using namespace std;
struct node {
int val,num;
bool operator <(const node &x) const {
return val>x.val;
}
};
priority_queue <node> dij;
vector < pair<int,int> > a[];
int n,m,s,dist[],done[]; //dist存储边权,done记录是否已经进行了松弛操作;
int main(){
cin>>n>>m>>s;
for(int i=;i<=m;i++){
int x,y,c;
cin>>x>>y>>c;
a[x].push_back(make_pair(y,c));
}
for(int i=;i<=m;i++){
dist [i]=0x7fffffff;//便于进行松弛 luogu的弱化版有一个测试点就是卡的这个,七个f打全。
}
dist [s]=;
dij.push((node){,s});//放入堆顶元素
while (!dij.empty()){//dij标准格式233
int front=dij.top().num;//重复取出堆顶 如果已经拓展过就continue 松弛操作同时满足条件放入堆 这三个操作 dij.pop();
if(done[front]) continue;
done[front]=true;
for(int i=;i<a[front].size();i++){
int to=a[front][i].first,vl=a[front][i].second;
if(!done[to] && dist[front]+vl<dist[to]){
dist[to]=dist[front]+vl;
dij.push((node){dist[to],to});
}
}
}
for(int i=;i<=n;i++) {
cout<<dist[i]<<" ";
}
return ;
}

留坑以后写pair的玄学用法