最短路

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

原文链接: https://www.cnblogs.com/LightyaChoo/p/13229436.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    最短路

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/361899

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 下午2:04
下一篇 2023年3月2日 下午2:05

相关推荐