算法模板之Dijkstra

Dijkstra是求单源最短路的一种算法,它不能够处理含有负权边的图。本质是递推,依次求出距离起点最近的点。

C++ 板子

#include<bits/stdc++.h>
#define ll long long
/*
题目链接:https://www.luogu.com.cn/problem/P3371
*/
using namespace std;
const int N=5e5+50;
const int inf=0x3f3f3f3f;
ll n,m,top,s,bad;
int e[N][2],nxt[N],hd[20000],dis[20000],vis[20000];
void add(int u,int v,int w){
    e[++top][0]=v,e[top][1]=w;
    nxt[top]=hd[u];
    hd[u]=top;
}
int main() {
    
    bad = (1L<<32)-1;
    
    cin >> n >> m >> s;
    for(int i=1;i<=m;i++) {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
    }
    
    priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > pq;
    pq.push(make_pair(0,s)); 
    memset(dis,0x3f,sizeof(dis));
    dis[s]=0;
    
    pair<int,int>p;
    while(pq.size()) {
        p = pq.top();
        pq.pop();
        int u=p.second;
        if(vis[u]) continue;
		vis[u]=1;
        for(int ev=hd[u];ev;ev=nxt[ev]) {
            int v=e[ev][0],w=e[ev][1];
            if(dis[u]+w<dis[v]) {
                dis[v]=dis[u]+w;
                pq.push(make_pair(dis[v],v));
            }
        }
    }
    
    for(int i=1;i<=n;i++) {
        if(dis[i]>=inf) {
            printf("%lld",bad);
        }else {
            printf("%d ",dis[i]);
        }
    }
    return 0;
}

java板子

/*
  java板子与c++板子并无大的区别,这里主要是写一下java的priorityqueue的写法
  剩下的其实都一样。
  需要注意的是,java默认的小根堆,而c++默认的是大根堆
*/

PriorityQueue<int[]>pq = new PriorityQueue<>( (a,b)->a[0]-b[0] );

posted @ 2020-10-21 22:35  Aackkom  阅读(121)  评论(0编辑  收藏  举报