码迷,mamicode.com
首页 > 其他好文 > 详细

最短路

时间:2020-07-03 12:11:33      阅读:57      评论:0      收藏:0      [点我收藏+]

标签:com   pos   ==   main   operator   type   scan   scanf   top   

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

最短路

标签:com   pos   ==   main   operator   type   scan   scanf   top   

原文地址:https://www.cnblogs.com/LightyaChoo/p/13229436.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!