首页 > 编程语言 > 详细

【模板】次短路算法

时间:2019-10-12 14:27:48      阅读:70      评论:0      收藏:0      [点我收藏+]

$dijkstra$ 算法求次短路模板。

#include<bits/stdc++.h>
using namespace std;
template<class T>inline void qread(T& x){
    char c;bool f=false;x=0;
    while((c=getchar())<0||9<c)if(c==-)f=true;
    for(x=(c^48);0<=(c=getchar())&&c<=9;x=(x<<1)+(x<<3)+(c^48));
    if(f)x=-x; 
}
template<class T,class... Args>inline void qread(T& x,Args&... args){qread(x),qread(args...);}
inline int rqread(){
    char c;bool f=false;int x=0;
    while((c=getchar())<0||9<c)if(c==-)f=true;
    for(x=(c^48);0<=(c=getchar())&&c<=9;x=(x<<1)+(x<<3)+(c^48));
    return f?-x:x;
}
template<class T>inline T Max(const T x,const T y){return x>y?x:y;}
template<class T>inline T Min(const T x,const T y){return x<y?x:y;}
template<class T>inline T fab(const T x){return x>0?x:-x;}
#define INF 0x3f3f3f3f
const int MAXM=100000;
const int MAXN=5000;
struct edge{
    int to,nxt,w;
    edge(){}
    edge(const int T,const int N,const int W):to(T),nxt(N),w(W){}
}e[(MAXM<<1)+5];
int tail[MAXN+5],N,M,ind;
void add_edge(const int u,const int v,const int w){
    e[++ind]=edge(v,tail[u],w);tail[u]=ind;
    e[++ind]=edge(u,tail[v],w);tail[v]=ind;
}
int disx[MAXN+5],disy[MAXN+5];
struct node{
    int u,w;
    node(){}
    node(const int U,const int W):u(U),w(W){}
    bool operator<(const node a)const{return !(w<a.w);}
};
void dijkstra(const int s){
    for(int i=1;i<=N;++i)disx[i]=disy[i]=INF;
    priority_queue<node>Q;
    Q.push(node(s,(disx[s]=0)));
    while(!Q.empty()){
        int now=Q.top().u,dis=Q.top().w;Q.pop();
        if(dis>disy[now])continue;
        for(int i=tail[now],calc,v;i;i=e[i].nxt){
            v=e[i].to,calc=dis+e[i].w;
            if(calc<disx[v]){
                swap(calc,disx[v]);
                Q.push(node(v,disx[v]));
            }
            if(disx[v]<calc&&calc<disy[v]){
                disy[v]=calc;
                Q.push(node(v,disy[v]));
            }
        }
    }
}
signed main(){
    qread(N,M);
    for(int i=1,a,b,c;i<=M;++i){
        qread(a,b,c);
        add_edge(a,b,c);
    }
    dijkstra(1);
    // for(int i=1;i<=N;++i)printf("%d %d\n",disx[i],disy[i]);
    printf("%d\n",disy[N]);
    return 0;
}

 

【模板】次短路算法

原文:https://www.cnblogs.com/MachineryCountry/p/11661048.html

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