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
样例输出
0 2 5 9 9
提示
一个点和自己的间距是0
代码
- 邻接表版
#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;}
阅读全文
1 0
- spfa最短路径
- 最短路径spfa
- spfa 最短路径
- 最短路径 -- spfa
- SPFA最短路径
- SPFA--最短路径
- 最短路径算法---SPFA
- 最短路径----SPFA算法
- 最短路径之 SPFA
- 【最短路径】SPFA算法
- SPFA算法【最短路径】
- SPFA最短路径模板
- 最短路径问题/Spfa
- 最短路径SPFA算法
- 【模板】最短路径spfa
- pku 3259(最短路径,spfa)
- POJ_2394_最短路径---SPFA算法
- 最短路径——SPFA
- LoRa信道争抢怎么办?传说中的冲突退避管用吗?
- HDU
- 【python】列表
- 风火轮树莓派3卡片电脑介绍
- c++ const 用法总结
- SPFA最短路径
- MyEclipse配置
- CodeForces
- 数学/物理知识在软件/算法中应用(1)
- ORAM思想
- 2017年7月24日21:10:02
- 哥德巴赫曾猜测 oj111
- HDU2037 解题报告
- 摘录 重点 面向对象 三大特征 理论