bellman-ford最短路(poj 1860判正环)

本文介绍了一种通过判断货币兑换循环中的正环来实现收益最大化的算法。通过使用Bellman-Ford算法,检测是否存在一种货币在多次转换后价值增加的情况,从而实现无限利润。文章详细解释了算法的实现过程,并提供了代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意就是  现在有N种货币 , 你有其中一种S , 和这种S货币的数量W

M行,每行都是其中一个城市  可以相互兑换的两种货币 A && B ,正汇率Rab , 正汇率兑换费Cab , 反贿赂Rba , 反贿赂兑换费Cba

问 能不能最后换回 货币S 的时候,钱数比原来多(其实就是类似老电视剧里的倒爷,或者买卖黄金赚钱)

 

一开始没想到就是判断正环,就是任意一种货币在 兑换循环中(循环中可能有多种货币的参与)实现了正增长,只要有正增长,就能一直换钱,换到   正无穷   那么必定换回原来的 货币S ,S的数量是比以前多的。

就是太菜了,冒得解释

但是后来想考虑如果一开始 连 换其他货币的兑换费都付不起怎么办

后来一想,汇率C都付不起 , (dist[u] - C) * R 也小于零 , 没问题

那直接匡斌的板子里 找了bellman-ford算法的板子

改了正环判(因为原本是判负环)直接贴个匡斌的板子,然后贴个本题代码。

const int INF=0x3f3f3f3f;
const int MAXN=550;
int dist[MAXN];
struct Edge{
	int u,v;
	int cost;
	Edge(int _u=0,int _v=0,int _cost=0):u(_u),v(_v),cost(_cost){}
};
vector<Edge>E;
//点的编号从 1 开始
bool bellman_ford(int start,int n){
	for(int i=1;i<=n;i++)dist[i]=INF;
	dist[start]=0;
	//最多做 n-1 次
	for(int i=1;i<n;i++){
		bool flag=false;
		for(int j=0;j<E.size();j++){
			int u=E[j].u;
			int v=E[j].v;
			int cost=E[j].cost;
			if(dist[v]>dist[u]+cost){
				dist[v]=dist[u]+cost;
				flag=true;
			}
		}
		if(!flag)return true;//没有负环回路
	}
	for(int j=0;j<E.size();j++)
		if(dist[E[j].v]>dist[E[j].u]+E[j].cost)
			return false;//有负环回路
	return true;//没有负环回路
}

 

本题代码

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <iostream>
#include <cmath>
#include <map>
#include <queue>
#include <algorithm>
#include <set>
#include <vector>
#include <stack>
#define Clear( x , y ) memset( x , y , sizeof(x) );
#define Qcin() std::ios::sync_with_stdio(false);
using namespace std;
typedef long long LL;
const int Maxn = 1e6 + 7;
const int Inf = 1e9 + 7;
int N , M , S;
double W;
const int INF=0x3f3f3f3f;
double dist[Maxn];
struct Edge{
	int u , v;
	double R , C;
	Edge(int _u=0,int _v=0,double _R=0,double _C = 0):u(_u),v(_v),R(_R),C(_C){}
};
vector <Edge> E;
//点的编号从 1 开始
bool bellman_ford(int start , int n){
	for(int i = 1 ; i <= n ; i++)	dist[i] = 0;
	dist[start] = W;
	//最多做 n-1 次
	for(int i = 1 ; i < n ; i++){
		bool flag = false;
		for(int j = 0 ; j < E.size() ; j++){
			int u = E[j].u;
			int v = E[j].v;
			double R = E[j].R;
			double C = E[j].C;
			if(dist[v] < (dist[u] - C) * R){
				dist[v] = (dist[u] - C) * R;
				flag = true;
			}
		}
		if(!flag)	break;
	}
	for(int i = 0 ; i < E.size() ; i++){
		if(dist[E[i].v] < (dist[E[i].u] - E[i].C) * E[i].R)
			return true;
	}
	return false;
}
int main()
{
	while(~scanf(" %d %d %d %lf",&N ,&M ,&S ,&W)){
		E.clear();
		int u , v;
		double Rab , Cab , Rba , Cba;
		for(int i = 1 ; i <= M ; i++){
			scanf(" %d %d %lf %lf %lf %lf",&u ,&v ,&Rab ,&Cab ,&Rba ,&Cba);
			E.push_back((Edge){u ,v ,Rab, Cab});
			E.push_back((Edge){v ,u ,Rba, Cba});
		}
		if(bellman_ford(S,N))	printf("YES\n");
		else	printf("NO\n");
	}
}

 

 

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事境科学研究的学者、政府保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值