最短路

Posted lightyachoo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路相关的知识,希望对你有一定的参考价值。

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

以上是关于最短路的主要内容,如果未能解决你的问题,请参考以下文章

最短路算法

进入公益传播的最短路径就在眼前|「蜂群计划」全国等你

地铁最短路径代码分析

最短路径

[最短路] aw1126. 最小花费(单源最短路建图+知识理解+代码细节+好题)

最短路求两点间最短路的Floyd算法及其matlab实现