Bellman-Ford算法模板题
POJ 3259 虫洞(Bellman-Ford判断有无负环的问题)
描述:
在探索他的许多农场时,Farmer John发现了许多令人惊叹的虫洞。虫洞是非常奇特的,因为它是一条单向路径,在您进入虫洞之前的某个时间将您带到目的地!每个FJ的农场包括Ñ(1≤ ñ ≤500)字段方便地编号为1 .. Ñ,中号(1≤ 中号 ≤2500)的路径,和w ^(1≤ w ^ ≤200)虫洞。
由于FJ是狂热的时间旅行爱好者,他想要做以下事情:从一些场地开始,穿过一些路径和虫洞,并在他最初离开前的一段时间返回起跑场。也许他将能够见到自己:)。
为了帮助FJ找出这是否可行与否,他将与完整的地图供你˚F(1≤ ˚F他的农场≤5)。没有路径需要超过10,000秒的旅行时间,没有虫洞可以使FJ及时返回超过10,000秒。
输入:
每个农场的第1行:分别为三个以空格分隔的整数:N,M和W
第2行。每个农场的M + 1:三个以空格分隔的数字(S,E,T)分别描述:双向路径在S和E之间需要T秒来遍历。两个字段可能通过多个路径连接。
线中号 2 .. 中号 + w ^每个场的1:三个空间分隔的数字(S,E,T)分别描述:从S到E的单向路径,也将旅行者移回T秒。
输出:
- //这是一道判断有无负环的题目,主要是为了熟悉bellman-Ford算法,写法也是采用模板题的写法
- #include <iostream>
- #include <cstring>
- #include <cmath>
- #include <algorithm>
- using namespace std;
- int f,n,m,w,all_e;
- int dis[];
- struct node{
- int s;
- int e;
- int t;
- } edge[];
- bool bellman_ford()
- {
- bool flag;
- for(int i=; i<n-; i++)
- {
- flag=false;
- for(int j=; j<all_e; j++)
- if(dis[edge[j].e] > dis[edge[j].s] + edge[j].t)
- {
- dis[edge[j].e] = dis[edge[j].s] + edge[j].t ;
- flag=true;
- }
- if(!flag)
- break;
- }
- for(int j=; j<all_e; j++)
- if(dis[edge[j].e] > dis[edge[j].s] + edge[j].t)
- return true;
- return false;
- }
- int main ()
- {
- cin>>f;
- while(f--)
- {
- memset(dis, 0x3f, sizeof(dis));
- cin>>n>>m>>w;
- all_e=;
- int u,v,c;
- for(int i=; i<m; i++)
- {
- cin>>u>>v>>c;
- edge[all_e].s=edge[all_e+].e=u;
- edge[all_e].e=edge[all_e+].s=v;
- edge[all_e].t=edge[all_e+].t=c;
- all_e=all_e+;
- }
- for(int i=; i<w; i++)
- {
- cin>>u>>v>>c;
- edge[all_e].s=u;
- edge[all_e].e=v;
- edge[all_e].t=-c;
- all_e++;
- }
- if(bellman_ford())
- cout<<"YES"<<endl;
- else
- cout<<"NO"<<endl;
- }
- return ;
- }
POJ 1860 兑换货币(判断有无正环)
描述
例如,如果你想在兑换点将100美元兑换成俄罗斯卢布,汇率为29.75,佣金为0.39,你将得到(100-0.39)*29.75=2963.3975RUR。
你当然知道,在我们的城市里,你可以对付N种不同的货币。让我们为每种货币分配从1到N的唯一整数。然后,每个交换点可以用6个数字来描述:整数A和B-它交换的货币数和实R。AB型、CAB型,R巴和C巴-交换A至B和B至A时的汇率和佣金。
尼克有一些货币S,他想知道他是否可以某种方式,在一些外汇操作后,增加他的资本。当然,他最终想把钱换成S货币。帮助他回答这个难题。尼克在做手术的时候总要有一笔非负的钱。
输入
每一点的汇率和佣金是真实的,小数点之后最多有两位数,即10。-2<=rate<=102,0<=佣金<=102.
如果在这个序列中没有不止一次使用交换点,那么让我们简单地调用交换操作的某些序列。您可以假设,在任何简单的交换操作序列的末尾和开始处的数字值的比率将小于10。4.
输出量
样本输入
- 3 2 1 20.0
- 1 2 1.00 1.00 1.00 1.00
- 2 3 1.10 1.00 1.10 1.00
样本输出
- YES
- //该题刚刚写的时候,不知道怎么处理这些数据,把这些数据看成图,其实本质都是一样的,只不给边赋予了性质,处理好这些数据又是一道模板题
- #include <iostream>
- #include <cstring>
- using namespace std;
- int g1[][]={},g2[][]={};
- double dis[]={};
- int n,m,s;
- double v;
- struct node{
- int a,b;
- double ha,hb;
- double ya,yb;
- }edge[];
- bool bellman_ford()
- {
- bool flag=false;
- for(int i=; i<n-; i++)
- {
- flag=false;
- for(int j=; j<*m; j++)
- {
- if((dis[edge[j].a]-edge[j].ya)*edge[j].ha>dis[edge[j].b])
- {
- dis[edge[j].b]=(dis[edge[j].a]-edge[j].ya)*edge[j].ha;
- flag=true;
- }
- }
- if(!flag)
- break;
- }
- for(int j=; j<*m; j++)
- {
- if((dis[edge[j].a]-edge[j].ya)*edge[j].ha>dis[edge[j].b])
- {
- dis[edge[j].b]=(dis[edge[j].a]-edge[j].ya)*edge[j].ha;
- return true;
- }
- }
- return false;
- }
- int main()
- {
- cin>>n>>m>>s>>v;
- dis[s]=v;
- for(int i=; i<*m; i=i+)
- {
- cin>>edge[i].a>>edge[i].b>>edge[i].ha>>edge[i].ya>>edge[i].hb>>edge[i].yb;
- edge[i+].b=edge[i].a, edge[i+].a=edge[i].b;
- edge[i+].ha=edge[i].hb, edge[i+].hb=edge[i].ha;
- edge[i+].ya=edge[i].yb, edge[i+].yb=edge[i].ya;
- }
- if(bellman_ford())
- cout<<"YES"<<endl;
- else
- cout<<"NO"<<endl;
- return ;
- }
Bellman-Ford算法模板题的更多相关文章
- Bellman—Ford算法思想
---恢复内容开始--- Bellman—Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题.对于给定的带权(有向或无向)图G=(V,E),其源点为s,加权函数w是边集E的映射.对图G ...
- Bellman - Ford 算法解决最短路径问题
Bellman - Ford 算法: 一:基本算法 对于单源最短路径问题,上一篇文章中介绍了 Dijkstra 算法,但是由于 Dijkstra 算法局限于解决非负权的最短路径问题,对于带负权的图就力 ...
- hdu 1711 KMP算法模板题
题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串 ...
- POJ 3041 匈牙利算法模板题
一开始预习是百度的算法 然后学习了一下 然后找到了学长的ppt 又学习了一下.. 发现..居然不一样... 找了模板题试了试..百度的不好用 反正就是wa了..果然还是应当跟着学长混.. 图两边的点分 ...
- poj 1274 The Perfect Stall【匈牙利算法模板题】
The Perfect Stall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20874 Accepted: 942 ...
- POJ 1459 Power Network(网络最大流,dinic算法模板题)
题意:给出n,np,nc,m,n为节点数,np为发电站数,nc为用电厂数,m为边的个数. 接下来给出m个数据(u,v)z,表示w(u,v)允许传输的最大电力为z:np个数据(u)z,表示发电 ...
- HDU - 2255 奔小康赚大钱 KM算法 模板题
HDU - 2255 题意: 分配n所房子给n个家庭,不同家庭对一所房子所需缴纳的钱是不一样的,问你应当怎么分配房子,使得最后收到的钱最多. 思路: KM算法裸题.上模板 #include <i ...
- Dijkstra算法与Bellman - Ford算法示例(源自网上大牛的博客)【图论】
题意:题目大意:有N个点,给出从a点到b点的距离,当然a和b是互相可以抵达的,问从1到n的最短距离 poj2387 Description Bessie is out in the field and ...
- UVA - 558 Wormholes (SPEA算法模板题)
先给出题面:https://vjudge.net/problem/UVA-558 题意描述:给你含n个点以及m条边的图,让你判断在这个图中是否存在负权回路. 首先,我们来介绍什么是SPEA算法 SPF ...
随机推荐
- C#实现全窗体范围拖动
using System.Runtime.InteropServices; [DllImport("user32.dll")] public static extern bool ...
- python全栈开发 * 线程锁 Thread 模块 其他 * 180730
一,线程Thread模块1.效率更高(相对于进程) import time from multiprocessing import Process from threading import Thre ...
- 怎样理解JAVA的“构造方法”和“主方法”
在类中除了成员方法之外,还存在一种特殊类型的方法,那就是构造方法.主方法是类的入口点,它定义了程序从何处开始: 主方法提供对程序流向的控制,Java编译器通过主方法来执行程序.那么,下面一起来看一下关 ...
- CLOSE_WAIT状态的原因与解决方法(转载留自己看)
这个问题之前没有怎么留意过,是最近在面试过程中遇到的一个问题,面了两家公司,两家公司竟然都面到到了这个问题,不得不使我开始关注这个问题.说起CLOSE_WAIT状态,如果不知道的话,还是先瞧一下TCP ...
- EasyUI实现分页、搜索、行按钮功能
1.html+js代码: <html> <head> <meta name="viewport" content="width=device ...
- 接口测试工具-Jmeter使用笔记(六:从文本读取参数)
使用场景:测试一个接口并发处理数据的能力,并且每次请求传入的参数都要不同. 解决方法--- CSV Data Set Config 列举一个实例,步骤中会侧重读取参数操作的说明,其他有疑问的步骤请查阅 ...
- 解决跨域问题-jsonp&cors
跨域的原因 浏览器的同源策略 同源策略是浏览器上为安全性考虑实施的非常重要的安全策略. 指的是从一个域上加载的脚本不允许访问另外一个域的文档属性. 举个例子:比如一个恶意网站的页面通过iframe嵌入 ...
- python中列表中元素的增删改查
增: append : 默认添加到列表的最后一个位置 insert : 可以通过下标添加到列表的任意位置 extend: a.extend[b] --将b列表的元素全加入到列表b中 删; remove ...
- linux----------安装Supervisor是用Python开发的一套通用的进程管理程序
1.linux环境必须安装 python 2.yum install python-setuptools 3.获取supervisor包 wget https://pypi.python.org/pa ...
- ListView的BeginUpdate()和EndUpdate()的用处
许多Windows 窗体控件(例如,ListView 和 TreeView 控件)实现了 BeginUpdate 和EndUpdate 方法,至于为何要这样用简单说明一下. 当我们向一个Listvie ...