poj1511(SPFA算法)
1.建⽴⼀个队列,初始时队列⾥只有起始点,再建⽴⼀个表格记录起始点到所有点的最短路径(该表格的初始值要赋为极⼤值,该点到他本⾝的路径赋为 无穷大)。然后执⾏松弛操作,⽤队列⾥有的点作为起始点去刷新到所有点的最短路,如果刷新成功且被刷新点不在队列中则把该点加⼊到队列最后。重复执⾏直到队列为空。
线路的规划方式是,每一次往返(即在同一站开始和结束的旅程)通过一个中央检查站站(CCS),每个乘客必须通过包括身体扫描在内的彻底检查。
每天支付志愿者旅行费用的最低金额。
由题意可知,最低金额的计算规则是:首先是单源点到其他点之间的最低费用之和sum1;然后是其他点到单源点之间的最低费用之和sum2。两个费用之和才是最后的志愿者旅行费用的最低金额。
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<cstdio>
using namespace std;
typedef long long ll;
const int maxx=1000005;
const int inf=0x3f3f3f3f;
struct node{int u,v,w;int next;
}num[maxx];
struct V{int u,v,w;
}TV[maxx];
queue<int>q;
int dist[maxx];
int pre[maxx];
int vis[maxx];
int n,m,k;
int cnt;
int head[maxx];
void add(int u,int v,int w){num[cnt].v=v;num[cnt].next=head[u];num[cnt].w=w;head[u]=cnt++;
}
void SPFA_min(int u){memset(dist,inf,sizeof(dist));q.push(u);vis[u]=1;dist[u]=0; while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=head[u];i!=-1;i=num[i].next){int v=num[i].v;if(dist[v]>dist[u]+num[i].w){dist[v]=dist[u]+num[i].w;pre[v]=u;if(vis[v]==0){q.push(v);vis[v]=1;}}}}
}
void init(int n){cnt=1;memset(vis,0,sizeof(vis));memset(pre,0,sizeof(pre));memset(head,-1,sizeof(head));while(!q.empty()){q.pop();}
}
int main(){int t;scanf("%d",&t);while(t--){scanf("%d %d",&n,&m);init(n);for(int i=1;i<=m;i++){int a,b,cost;scanf("%d %d %d",&a,&b,&cost);TV[i].u=a;TV[i].v=b;TV[i].w=cost;add(a,b,cost);}ll mincost=0;SPFA_min(1);for(int i=1;i<=n;i++){mincost+=dist[i];}init(n);for(int i=1;i<=m;i++){add(TV[i].v,TV[i].u,TV[i].w);}SPFA_min(1);for(int i=1;i<=n;i++){mincost+=dist[i];}cout<<mincost<<endl;}return 0;
}
poj1511(SPFA算法)相关推荐
- poj 3662 Telephone Lines spfa算法灵活运用
意甲冠军: 到n节点无向图,它要求从一个线1至n路径.你可以让他们在k无条,的最大值.如今要求花费的最小值. 思路: 这道题能够首先想到二分枚举路径上的最大值,我认为用spfa更简洁一些.spfa的本 ...
- 图论-最短路径--3、SPFA算法O(kE)
SPFA算法O(kE) 主要思想是: 初始时将起点加入队列.每次从队列中取出一个元素,并对所有与它相邻的点进行修改,若某个相邻的点修改成功,则将其入队.直到队列为空时算法结束. 这个算 ...
- HDU3440(差分约束+SPFA算法)
题意:两栋房子之间的最大距离为D,也就是A-B<=D,现在求出最矮和最高房子之间的最大距离 思路:差分约束+SPFA算法: 当问题可以转化为形如一组 xi‑x'i<=yi 或一组 xi‑x ...
- poj2387(SPFA算法)
1.建⽴⼀个队列,初始时队列⾥只有起始点,再建⽴⼀个表格记录起始点到所有点的最短路径(该表格的初始值要赋为极⼤值,该点到他本⾝的路径赋为 无穷大).然后执⾏松弛操作,⽤队列⾥有的点作为起始点去刷新到所 ...
- 图论刷水题记录(二)(最短路-----SPFA算法)
继第一篇的后续,又来刷水题了,写的是SPFA算法,这个算法的复杂度比较玄学,感觉能不用就不用了,但是他的好处就是可以判断负圈. 3月26日: 1.POJ 1847 Tram 题意:在一个交通网络上有N ...
- SPFA算法O(kE)
SPFA算法O(kE) Dijkstra和Floyed是不断的试点.Dijkstra试最优点,Floyed试所有点. Bellman-Ford和SPFA是不断的试边.Bellman-Ford是盲目的试 ...
- (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法
一.floyd 1.介绍 floyd算法只有五行代码,代码简单,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3),可以求多源最短路问题. 2.思想: Floyd算法的基本思想如下:从任意 ...
- 最短路径:Dijkstra、BellmanFord以及SPFA算法
最短路径问题 1.Dijkstra算法 简介 (1)Dijkstra算法伪代码 (2)C++ 邻接表版代码 (3)优化 (4)题型分析 2.Bellman Ford算法 简介 (1)Bellman算法 ...
- 最短路径(Dijkstra、Bellman-Ford和SPFA算法)
最短路径(Dijkstra.Bellman-Ford和SPFA算法) 前言 图的存储方式 邻接矩阵 邻接表 链表建立 利用vector 结构体 核心思路 Dijkstra算法 图解 基本思想 求解步骤 ...
- HDU SPFA算法 Invitation Cards
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1535 分析: 题意:求1点到其它点的最短距离之和+其它点到1点的最短距离之和 前面一部分直接用SPFA ...
最新文章
- 3. 5种常见卷积论文、解读、使用方法、实现代码整理(conv)
- Puppet扩展篇1-自定义fact结合ENC(hirea)的应用实践
- 链表问题20——按照左右半区的方式重新组合单链表
- 商城开发(1)-前期准备
- 获取Json中特定的值
- 牛客网_PAT乙级_1017打印沙漏(20)
- U-GAT-IT 论文阅读
- java 苹果h5不能播放_H5音频不能自动播放的问题
- odoo10参考系列--网络控制器(Web Controllers)
- MATLAB simulink 2FSK调制与解调实验,附仿真文件(西电B测)
- 统计软件测试应用,应用统计过程控制监控软件测试过程.PDF
- vue 局部回到顶部_VUE回到顶部功能
- Cisco Packet Tracer入门--三层交换机局域网搭建教程
- web-登陆界面html-数据库
- 人民币转大写 java_把数字转换成人民币大写的形式
- 编程向未来---启程
- CentOS 7.4安装配置Oracle 12cR2 12.2.0.1.0
- 【转】canvas初探
- ctrl+alt+t 函数注释快捷键失效KoroFileHeader
- 跳一跳,python脚本原理