• 模板


    第一次用Markdown编辑器写博文呢。
    单源最短路的模板,链式前向星写法。

    非负权的单源最短路Dijkstra算法。

    Dijkstra

    #include<bits/stdc++.h>
    using namespace std;
    
    const int INF=0x3f3f3f3f;
    
    /* begin 链式前向星 */
    
    const int MAXN=1000010;
    const int MAXM=2000010;
    
    struct Edge{
        int v,w,next;
        Edge(int v=0,int w=0):v(v),w(w){}
    };
    
    int cnt_edge;
    int head[MAXN+5];
    Edge edge[MAXM+5];
    
    inline void init_graph(int n){
        cnt_edge=0;
        memset(head+1,0,sizeof(head[0])*n);
    }
    
    inline void add_edge(int u,int v,int w){
        cnt_edge++;
        edge[cnt_edge].v=v;
        edge[cnt_edge].w=w;
        edge[cnt_edge].next=head[u];
        head[u]=cnt_edge;
    }
    
    /* end 链式前向星 */
    
    
    /* begin Dijkstra */
    
    bool vis[MAXN+5];
    int dis[MAXN+5];
    
    struct Edge_node{
        int v,w;
        Edge_node(int v=0,int w=0):v(v),w(w){}
        bool operator<(const Edge_node &e)const {
            return w>e.w;
        }
    };
    
    
    void Dijkstra(int n,int s){
        memset(vis+1,0,sizeof(vis[0])*n);
        for(int i=1;i<=n;i++) dis[i]=INF;
    
        priority_queue<Edge_node> pq;
        dis[s]=0;
        pq.push(Edge_node(s,0));
        while(!pq.empty()){
            int u=pq.top().v;
            pq.pop();
            if(vis[u])continue;
            vis[u]=1;
            for(int i=head[u];i;i=edge[i].next){
                int &v=edge[i].v;
                int &w=edge[i].w;
                if(!vis[v]&&dis[v]>dis[u]+w){
                    dis[v]=dis[u]+w;
                    pq.push(Edge_node(v,dis[v]));
                }
            }
        }
    }
    
    /* end Dijkstra */
    
    int main(){
        int n,m,s;
        while(~scanf("%d%d%d",&n,&m,&s)){
            init_graph(n);
    
            for(int i=1;i<=m;i++){
                int u,v,w;
                scanf("%d%d%d",&u,&v,&w);
                add_edge(u,v,w);
            }
    
            Dijkstra(n,s);
            for(int i=1;i<=n;i++){
                printf("%d%c",dis[i]," 
    "[i==n]);
            }
        }
    }
    
  • 相关阅读:
    b_lc_长度为 3 的不同回文子序列(统计两个相同字符中间有多少个不同字符)
    b_lc_最小未被占据椅子的编号(记录每个时间来的人 + pq)
    b_lc_统计好数字的数量(排列数+组合数+快速幂)
    TreeMap
    LinkedHashMap
    HashMap的总结
    HashMap
    Collection
    Map
    LinkedList学习
  • 原文地址:https://www.cnblogs.com/Yinku/p/10575322.html
Copyright © 2020-2023  润新知