Poj 1860 Currency Exchange (SPFA变形)

本文介绍使用SPFA算法寻找能使货币通过兑换增加的正环路径。通过调整松弛条件实现从最短路到最长路问题的转换,并利用SPFA算法高效解决此问题。

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

题意:任何两个国家的钱币都有汇率,当然也有手续费。如果A换B的汇率为C,手续费为D,当你用A换成B时,你最后可以得到(A-D)*C的B铅笔。询问你是否存在一种兑换方式,让你的钱币增加。

题解:这是一个找正环的的题,但是我们之前只讲过如何判断负环,但是实际我们会发现,这和之前的最短路的算法很类似,我们是需要在松弛条件上改一下大于小于号,就可以把最短路问题,就变成最长路,再考虑另外一个问题。我们如何判断正环,也就是经过一个环,权值变大。我们之前知道,如果一个图中如果不存在负环,那么最短路,最多是由n-2个点松弛出来的,也就是由n-1条遍构成的。借此思路,我们可以得到,最长路中正环的思路也是一样的。bellman-ford太慢,所以在这里用SPFA来解决此问题。

这里所有的正环是指经过这个环可以让钱变多的环。

具体看代码注释:

#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 105;   
int n,mark[N]; // mark表示该点是否在队列中 
int visit[N],s; // 标记数组 用来记录,被松弛的几次 
double dis[N],v; // dis记录 到i点的最长路 
struct node{
	int f;   // 表示i到j之间能兑换 
	double c,r;  // c表示 手续费,r表示兑换率 
}map[N][N];

int spfa(){
	int i,cur;
	queue<int> q;
	memset(mark,0,sizeof(mark));  // 清空很重要 
	memset(visit,0,sizeof(visit));
	memset(dis,0,sizeof(dis));
	mark[s] = 1; // 起始点入队 
	visit[s] = 1;  // 标记起始点 
	dis[s] = v;   // 起始点最开始一定是自己 
	q.push(s);
	while(!q.empty()){
		cur = q.front();
		mark[cur] = 0;
		q.pop();
		for(int i = 1; i <= n; i ++){
			if(map[cur][i].f){  // 如果有兑换方法 
				if(dis[i] <(dis[cur] - map[cur][i].c)*map[cur][i].r){  // 那么判断能不能松弛 
					dis[i] = (dis[cur] - map[cur][i].c)*map[cur][i].r;
						if(!mark[i]){      // 如果没在队列中 
							mark[i] = 1;   // 标记 
							visit[i]++;    // 记录i被松弛了一次 
							if(visit[i] > n)  // 若某个点被松弛n次以上,存在正环 
								return 1;
							q.push(i);  // 添加队列 
						}
				}
			}
		}
	}
	return 0;
}
int main(){
	int m,a,b;
	double c,d,e,f;
	while(~scanf("%d%d%d%lf",&n,&m,&s,&v)) {
		memset(map,0,sizeof(map));
		while(m--){
			cin >> a >> b >> c >> d >> e >> f; //存图 
			map[a][b].f = 1;
			map[a][b].r = c;
			map[a][b].c = d;
			map[b][a].f = 1;
			map[b][a].r = e;
			map[b][a].c = f;
		}
		if(spfa())
			cout << "YES" << endl;
		else 
			cout << "NO"  << endl;
	}
}

内容概要:本文探讨了在MATLAB/SimuLink环境中进行三相STATCOM(静态同步补偿器)无功补偿的技术方法及其仿真过程。首先介绍了STATCOM作为无功功率补偿装置的工作原理,即通过调节交流电压的幅值和相位来实现对无功功率的有效管理。接着详细描述了在MATLAB/SimuLink平台下构建三相STATCOM仿真模型的具体步骤,包括创建新模型、添加电源和负载、搭建主电路、加入控制模块以及完成整个电路的连接。然后阐述了如何通过对STATCOM输出电压和电流的精确调控达到无功补偿的目的,并展示了具体的仿真结果分析方法,如读取仿真数据、提取关键参数、绘制无功功率变化曲线等。最后指出,这种技术可以显著提升电力系统的稳定性与电能质量,展望了STATCOM在未来的发展潜力。 适合人群:电气工程专业学生、从事电力系统相关工作的技术人员、希望深入了解无功补偿技术的研究人员。 使用场景及目标:适用于想要掌握MATLAB/SimuLink软件操作技能的人群,特别是那些专注于电力电子领域的从业者;旨在帮助他们学会建立复杂的电力系统仿真模型,以便更好地理解STATCOM的工作机制,进而优化实际项目中的无功补偿方案。 其他说明:文中提供的实例代码可以帮助读者直观地了解如何从零开始构建一个完整的三相STATCOM仿真环境,并通过图形化的方式展示无功补偿的效果,便于进一步的学习与研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值