算法模板之Dijkstra

2021-03-23 07:26

阅读:700

标签:priority   ++   cto   cond   scanf   题目   递推   默认   new   

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

C++ 板子

#include
#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> n >> m >> s;
    for(int i=1;i,vector >,greater > > pq;
    pq.push(make_pair(0,s)); 
    memset(dis,0x3f,sizeof(dis));
    dis[s]=0;
    
    pairp;
    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=inf) {
            printf("%lld",bad);
        }else {
            printf("%d ",dis[i]);
        }
    }
    return 0;
}

java板子

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

PriorityQueuepq = new PriorityQueue( (a,b)->a[0]-b[0] );

算法模板之Dijkstra

标签:priority   ++   cto   cond   scanf   题目   递推   默认   new   

原文地址:https://www.cnblogs.com/backkom-buaa/p/13855320.html


评论


亲,登录后才可以留言!