zoukankan      html  css  js  c++  java
  • 最短路

    dijkstra+堆优化:

    P4779 【模板】单源最

    code:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=3e5;
    int n,m;
    int s,x,y,w;
    int head[N];
    int dis[N];
    bool vis[N];
    int cnt;
    struct edge{
        int to;
        int ne;
        int w;
    }e[N];
    
    struct node{
        int dis;
        int pos;
        bool operator <(const node &x)const
        {
            return x.dis<dis;
        }
    };
    
    priority_queue<node>q;
    
    void add(int u,int v,int w){
        e[++cnt].to=v;
        e[cnt].w=w;
        e[cnt].ne=head[u];
        head[u]=cnt;
    }
    
    void dij(){
        dis[s]=0;
        q.push( (node) {0,s});
        while(!q.empty()){
            node temp = q.top();
            q.pop();
            int x=temp.pos;
            int d=temp.dis;
            if(vis[x])continue;
            vis[x]=1;
            for(int i=head[x];i;i=e[i].ne){
                int y=e[i].to;
                if(dis[y]>dis[x]+e[i].w){
                    dis[y]=dis[x]+e[i].w;
                    if(!vis[y]){
                        //vis[y]=1;
                        q.push( (node){dis[y],y});
                    }
                }
            }
        }
    }
    
    int main(){
        scanf("%d%d%d",&n,&m,&s);
        for(int i=1;i<=n;i++)dis[i]=0x3f3f3f3f;
        for(int i=1;i<=m;i++){
            scanf("%d%d%d",&x,&y,&w);
            add(x,y,w);
        }
        dij();
        for(int i=1;i<=n;i++){
            printf("%d ",dis[i]);
        }
        return 0;
    }

    spfa:

    P3371 【模板】单源最短路径(弱化版)

    code:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=6e5;
    const int INF=2147483647;
    int n,m,s;
    int x,y,w;
    bool vis[N];
    int dis[N];
    int head[N],cnt;
    queue<int>q;
    
    struct node{
        int to;
        int ne;
        int w;
    }e[N];
    
    void add(int u,int v,int w){
        e[++cnt].to=v;
        e[cnt].ne=head[u];
        e[cnt].w=w;
        head[u]=cnt;
    }
    
    void spfa(int s){
        //memset(dis,0x3f,sizeof(dis));
        for(int i=1;i<=n;i++){
            dis[i]=INF;
            vis[i]=false;
        }
        dis[s]=0;
        q.push(s);
        vis[s]=true;
        while(!q.empty()){
            int u = q.front();
            q.pop();
            vis[u]=0;
            for(int i=head[u];i;i=e[i].ne){
                int v = e[i].to;
                if(dis[u]+e[i].w<dis[v]){
                    dis[v]=dis[u]+e[i].w;
                    if(!vis[v]){
                        q.push(v);
                        vis[v]=true;
                    }
                }
            }
        }
    }
    
    int main(){
        scanf("%d%d%d",&n,&m,&s);
        for(int i=1;i<=m;i++){
            scanf("%d%d%d",&x,&y,&w);
            add(x,y,w);
        }
        spfa(s);
        for(int i = 1;i <= n;i++){
            if(s==i)printf("0 ");
            else printf("%d ",dis[i]);
        }
        return 0;
    } 
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=6e5;
    const int INF=2147483647;
    int n,m,s;
    int x,y,w;
    bool vis[N];
    int dis[N];
    int head[N],cnt;
    queue<int>q;
    
    struct node{
        int to;
        int ne;
        int w;
    }e[N];
    
    void add(int u,int v,int w){
        e[++cnt].to=v;
        e[cnt].ne=head[u];
        e[cnt].w=w;
        head[u]=cnt;
    }
    
    void spfa(int s){
        //memset(dis,0x3f,sizeof(dis));
        for(int i=1;i<=n;i++){
            dis[i]=INF;
            vis[i]=false;
        }
        dis[s]=0;
        q.push(s);
        vis[s]=true;
        while(!q.empty()){
            int u = q.front();
            q.pop();
            vis[u]=0;
            for(int i=head[u];i;i=e[i].ne){
                int v = e[i].to;
                if(dis[u]+e[i].w<dis[v]){
                    dis[v]=dis[u]+e[i].w;
                    if(!vis[v]){
                        q.push(v);
                        vis[v]=true;
                    }
                }
            }
        }
    }
    
    int main(){
        scanf("%d%d%d",&n,&m,&s);
        for(int i=1;i<=m;i++){
            scanf("%d%d%d",&x,&y,&w);
            add(x,y,w);
        }
        spfa(s);
        for(int i = 1;i <= n;i++){
            if(s==i)printf("0 ");
            else printf("%d ",dis[i]);
        }
        return 0;
    } 

    求正权图最短路用dijkstra,求带有带有负权的用spfa

  • 相关阅读:
    语言:障碍与桥梁(探索语言的本质、如何避免语言上的误解)
    知觉:看到什么就是什么(怎么避免误解别人的行为)
    沟通和认同:自我的塑造与展现(如何认识自我,如何袒露自我,如何回应尴尬问题)
    人际沟通入门(认清沟通高手的特质)
    人际沟通与社交媒体(媒介沟通的优缺点)
    javascript中的this值
    Javascript 模块化编程 --RequireJs
    datetime与int 转换通用函数
    c# 读写cookie 通用函数
    分类组件
  • 原文地址:https://www.cnblogs.com/LightyaChoo/p/13229436.html
Copyright © 2011-2022 走看看