最短路径spfa
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std; const int inf = 1<<30;
const int L = 200000; struct Edges
{
int x,y,w,next;
} e[L<<2]; int head[L];
int dis[L];
int vis[L];
int cnt[L]; void AddEdge(int x,int y,int w,int k)
{
e[k].x = x,e[k].y = y,e[k].w = w,e[k].next = head[x],head[x] = k;
}
int relax(int u,int v,int c)
{
if(dis[v]>dis[u]+c)
{
dis[v] = dis[u]+c;
return 1;
}
return 0;
} int SPFA(int src)
{
int i;
memset(cnt,0,sizeof(cnt));
dis[src] = 0;
queue<int> Q;
Q.push(src);
vis[src] = 1;
cnt[src]++;
while(!Q.empty())
{
int u,v;
u = Q.front();
Q.pop();
vis[u] = 0;
for(i = head[u]; i!=-1; i=e[i].next)
{
v = e[i].y;
if(relax(u,v,e[i].w)==1 && !vis[v])
{
Q.push(v);
vis[v] = 1;
}
}
}
} int main()
{
int t,n,m;
int i,j;
scanf("%d%d",&n,&m);
memset(e,-1,sizeof(e));
for(i = 1; i<=n; i++)
{
dis[i] = inf;
vis[i] = 0;
head[i] = -1;
}
for(i = 0; i<m; i++)
{
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
AddEdge(x,y,w,i);
}
SPFA(1);
for(i = 2; i<=n; i++)
printf("%d\n",dis[i]); return 0;
} #include<iostream>
#include<queue>
#include<memory.h>
using namespace std; const int inf=1<<30;
const int N=200005;
struct Edge
{
int u,v,w,next;
};
int head[N];
int dis[N];
int vis[N];
Edge e[N]; void addEdge(int from,int to,int we,int i)
{
e[i].u=from;
e[i].v=to;
e[i].w=we;
e[i].next=head[from];
head[from]=i;
} bool releax(int u,int v,int w)
{
if(dis[u]+w<dis[v])
{
dis[v]=dis[u]+w;
return true;
}
return false;
} void spfa(int x)
{
queue<int> q;
q.push(x);
vis[x]=1;
dis[x]=0;
while(!q.empty())
{
int u,v,i;
u=q.front();
q.pop();
vis[u]=0;
for(i=head[u];i!=-1;i=e[i].next)
{
v=e[i].v;
if(!vis[v]&&releax(u,v,e[i].w))
{
q.push(v);
vis[v]=1;
}
}
} } int main()
{
//cout<<inf<<' '<<N<<endl;
int n,m,i,u,v,w;
//memset(head,-1,sizeof(head));
//memset(dis,inf,sizeof(dis));
//memset(vis,0,sizeof(vis));
//memset(e,-1,sizeof(e));
cin>>n>>m;
for(i=1;i<=n;i++)
{
head[i]=-1;
dis[i]=inf;
vis[i]=0;
}
for(i=1;i<=m;i++)
{
cin>>u>>v>>w;
addEdge(u,v,w,i);
} /*for(i=1;i<=m;i++)
{
cout<<e[i].u<<' '<<e[i].v<<' '<<e[i].next<<endl;
}
for(i=1;i<=3;i++)
cout<<head[i]<<' ';*/
spfa(1);
for(i=2;i<=n;i++)
{
cout<<dis[i]<<endl;
} return 0;
}
最短路径spfa的更多相关文章
- [最短路径SPFA] POJ 1847 Tram
Tram Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 14630 Accepted: 5397 Description Tra ...
- 最短路径--SPFA 算法
适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径一 ...
- 最短路径 SPFA P3371 【模板】单源最短路径(弱化版)
P3371 [模板]单源最短路径(弱化版) SPFA算法: SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环.SPFA 最坏情况下复 ...
- 最短路径——SPFA算法
一.前提引入 我们学过了Bellman-Ford算法,现在又要提出这个SPFA算法,为什么呢? 考虑一个随机图(点和边随机生成),除了已确定最短路的顶点与尚未确定最短路的顶点之间的边,其它的边所做的都 ...
- 图的最短路径-----------SPFA算法详解(TjuOj2831_Wormholes)
这次整理了一下SPFA算法,首先相比Dijkstra算法,SPFA可以处理带有负权变的图.(个人认为原因是SPFA在进行松弛操作时可以对某一条边重复进行松弛,如果存在负权边,在多次松弛某边时可以更新该 ...
- luogu P3371 & P4779 单源最短路径spfa & 最大堆优化Dijkstra算法
P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出 ...
- 最短路径----SPFA算法
求最短路径的算法有许多种,除了排序外,恐怕是ACM界中解决同一类问题算法最多的了.最熟悉的无疑是Dijkstra,接着是Bellman-Ford,它们都可以求出由一个源点向其他各点的最短路径:如果我们 ...
- LD1-B(最短路径-SPFA)
题目链接 /* *题目大意: *给定v个点的重量,并给定e条边,每条边具有一个权值; *在e条边中选v-1条边使这v个点成为一棵树; *定义这棵树的代价为(每棵子树节点重量和其子树根到父节点的边的权值 ...
- 枚举最短路径+SPFA
Harry Potter and the Final Battle Submit Status Description The final battle is coming. Now Harry Po ...
- 【SPFA与Dijkstra的对比】CDOJ 1961 咸鱼睡觉觉【差分约束-负权最短路径SPFA】
差分约束系统,求最小值,跑最长路. 转自:https://www.cnblogs.com/ehanla/p/9134012.html 题解:设sum[x]为前x个咕咕中至少需要赶走的咕咕数,则sum[ ...
随机推荐
- ld: framework not found FileProvider for architecture arm64
出现这个问题是因为 静态库是用Xcode9打包的. 如果用xcode8编译的话就会出现这个问题 解决办法 从Xcode9里把这个库拷贝出来.然后放到Xcode8上面 One way to fix t ...
- CSS单行格式化与压缩
工具简介:CSS单行格式化与压缩工具
- 小程序学习笔记五:API
API 小程序提供了丰富的微信原生API,可以方便的调起微信提供的能力,如获取用户信息,本地存储,支付功能等. api调用格式: 1:wx.on 开头的 API 是监听某个事件发生的API接口,接受一 ...
- 用分离、附加的方式实现sql server数据库的备份和还原
一.数据库分离.附加的说明 SQL Server提供了"分离/附加"数据库."备份/还原"数据库.复制数据库等多种数据库的备份和恢复方法.这里介绍一种学习中常用 ...
- exception:Failed to execute 'toDataURL' on 'HTMLCanvasElement' 解决方案
1.情景展示 当使用canvas 将图片转为base64报错信息如下: Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLC ...
- MySQL导出TSV格式文件
可以使用mysqldump, 也可以使用mysql -e 使用mysqldump 因为要使用到 -T / --tab 参数, 需要先查看mysql设置的secure_file_priv mysql&g ...
- 【go】golang中置new()函数和make()函数的区别
Go语言中的内建函数new和make是两个用于内存分配的原语(allocation primitives),其功能相似,却有本质区别. 1.new 官方文档 // The new built-in f ...
- Jquery DataTables 获取表格数据及行数据
注意table变量是 1.jQuery DataTables 行号获取 $("#example tbody tr").on("click", function( ...
- Effective Java 第三版—— 86. 非常谨慎地实现SERIALIZABLE接口
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- 【CFD之道】2018年原创文章汇总
以下是公众号CFD之道2018年的全部原创文章,共计210篇. 1 Fluent验证案例[60篇] Fluent验证案例02:通过均匀热通量管道层流流动 Fluent验证案例03:管道中湍流流动压降计 ...