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

  • 相关阅读:
    Struts访问servletAPI方式
    Struts结果跳转方式(四种result配置)
    struts与ognl结合【重要】
    Yii --Command 任务处理
    安卓 短信去重(看好了,是短信去重,不是联系人去重)
    快速排序算法之我见(附上C代码)
    Ext JS4百强应用:设置textfield的悬浮提示信息 --第8强
    窗体添加阴影效果如此简单
    使用apache daemon让java程序在unix系统上以服务方式运行
    控件布局通用解决方案
  • 原文地址:https://www.cnblogs.com/LightyaChoo/p/13229436.html
Copyright © 2011-2022 走看看