首页 > 其他 > 详细

Dijkstra模板

时间:2021-05-18 15:41:16      阅读:17      评论:0      收藏:0      [点我收藏+]

拖了很久,意识到还是要整理下模板的,不然太容易写炸了

注意点:1.优先队列是使用‘<"来比较大小的,所以结构体重载的时候要重载它,而且是反着的,因为我们要挑选最小值,而优先队列默认是大的在前面(也就是less)。

2.注意初始化两个数组,dis和vis。dis初始化为INF,INF取大一点,不然可能会爆掉。

其他看注释即可

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+2;
const int INF =1e9+7;
int dis[maxn];bool vis[maxn];// ò???ê??àà?êy×é£?ò???ê?±ê??êy×é 
// ×¢òa ó??è?óáD??è?ê1ó? < ±è?? ???ò??è?ê?′óμ??μ?ú?°???£óéóúdijkstraê?ê1ó?
// ì???×?D??μ£??ùò??ò??òa?????? < ????·?£????òè?D?μ??ú?°??£?ê?·′μ?. 
struct Node{
    int v,cost;
    bool operator < (const Node &rhs) const{
        return cost>rhs.cost;
    }
};
vector<Node> G[maxn];
int main(){
    int n,m,s;cin>>n>>m>>s;
    for(int i=1;i<=m;i++){
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        G[u].push_back((Node){ v,w});    
    }
    for(int i=0;i<=n;i++){
        dis[i]=INF;vis[i]=false;
    } //±eíüá?3?ê??ˉ 
    dis[s]=0;
    priority_queue<Node> q;
    q.push((Node){ s,0});
    while(!q.empty()){
        int x=q.top().v; q.pop();
        if(vis[x]) continue;
        vis[x]=true;
        for(int i=0;i<G[x].size();i++){
            int to=G[x][i].v;int w=G[x][i].cost;
            if(dis[to]>dis[x]+w){
                dis[to]=dis[x]+w;
                q.push((Node){ to,dis[to]});
            }
        }
    }
    for(int i=1;i<=n;i++){
        printf("%d ",dis[i]);
    }
return 0;}

 

Dijkstra模板

原文:https://www.cnblogs.com/minato-yukina/p/14780092.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!