SPFA最短路径

来源:互联网 发布:js中嵌套java代码 编辑:程序博客网 时间:2024/05/16 23:37

SPFA最短路径


  • SPFA最短路径
    • 题目
    • 代码


并没有详细讲解,只是保存模板。

题目

要求

给定一个图,一个源点,求这个点到每个其他点的最短路径。
输入和输出
输入
第一行:n,m(点数和路径数)
接下来m行:x,y,len(两个相连的点,路径长度)无向
最后一行:数字st,表示源点

输出
由st向各个其他点走的最短路径(按照点编号顺序,间隔一个空格输出)
样例
样例输入

5 7
1 2 2
1 5 10
2 3 3
2 5 7
3 4 4
4 5 5
5 3 6
1

image

样例输出

0 2 5 9 9

提示
一个点和自己的间距是0

代码

  1. 邻接表版
#include<iostream>#include<algorithm>#include<queue>#include<cstring>#define maxn (100000+10) using namespace std;struct node{    int next,to,w;} e[maxn];int n,m,st/*输入的源点*/;int cnt=1,head[maxn],dis[maxn],vis[maxn];queue <int> q;void add(int x,int y,int len){    e[cnt].to=y;    e[cnt].w=len;    e[cnt].next=head[x];    head[x]=cnt;    cnt++;}void spfa(int x)/*源点*/{    q.push(x);    dis[x]=0;    while(!q.empty()){        int cur=q.front();        q.pop();        for(int i=head[cur];~i;i=e[i].next){            if(dis[e[i].to]>e[i].w+dis[cur]){                dis[e[i].to]=e[i].w+dis[cur];                if(!vis[e[i].to]){                    vis[e[i].to]=1;                    q.push(e[i].to);                 }            }        }    }   } int main(){    ios::sync_with_stdio(false);    memset(head,-1,sizeof(head));    memset(dis,0x3f3f3f3f,sizeof(dis));    memset(vis,0,sizeof(vis));    cin>>n>>m;    for(int i=1;i<=m;i++){        int x,y,len;        cin>>x>>y>>len;        add(x,y,len);        add(y,x,len);    }    cin>>st;    spfa(st);    for(int i=1;i<=n;i++)        cout<<dis[i]<<" ";    return 0;}

2 . Vector版

#include<iostream>#include<algorithm>#include<queue>#include<cstring>#include<vector>#define maxn (100000+10) using namespace std;struct E{    int p;    int dis;};int n,m,st/*输入的源点*/;int head[maxn],dis[maxn],vis[maxn];vector<E> edge[maxn];void add(int x,int y,int len){    E temp;    temp.dis=len;temp.p=y;    edge[x].push_back(temp);}queue <int> q;void spfa(int x)/*源点*/{    q.push(x);    dis[x]=0;    while(!q.empty()){        int cur=q.front();        q.pop();        int len=edge[cur].size();        for(int i=0;i<len;i++){            if(dis[edge[cur][i].p]>edge[cur][i].dis+dis[cur]){                dis[edge[cur][i].p]=edge[cur][i].dis+dis[cur];                if(!vis[edge[cur][i].p]){                    vis[edge[cur][i].p]=1;                    q.push(edge[cur][i].p);                 }            }        }    }   } int main(){    ios::sync_with_stdio(false);    memset(head,-1,sizeof(head));    memset(dis,0x3f3f3f3f,sizeof(dis));    memset(vis,0,sizeof(vis));    cin>>n>>m;    for(int i=1;i<=m;i++){        int x,y,len;        cin>>x>>y>>len;        add(x,y,len);        add(y,x,len);    }    cin>>st;    spfa(st);    for(int i=1;i<=n;i++)        cout<<dis[i]<<" ";    return 0;}
原创粉丝点击