POJ 2135 费用流 spfa

本文聚焦于网络流算法的学习与应用,并通过解决POJ平台上的问题来加深理解。同时,作者提及了尝试学习平衡树算法的挑战,表达了对自身技能提升的渴望。

本人蒟蒻啊!!!!!!!!!!!!!!

本周停课想把网络流和平衡树的算法都掌握的,可惜太弱了,只把网络流弄会。


http://poj.org/problem?id=2135

大概题意:从起点到终点再回到起点 每条边最多走一边。问最少的费用。

这一题算是比较裸的费用流了,类似于某年NOIP的传纸条。

这题可以看成从起点到终点走两次,不过最短路显然是不对的。我们可以建一个超级源点,然后从超级S点向起点建立一条流量为2 费用为0的边,然后其余的边流量为0,

做两次spfa费用流就可以了。(以前背zkw的,然后这次因为余翔等说没有题目刻意卡spfa网络流,再加上spfa很早就会了,没有看标称就自己写出来了,幸福感爆棚啊!)


注意的是,这题是无向图+重边,读入一条边要建立4条边,也就是当作2条有向边建图,我用的是数组模拟邻接表(类似于边集数组(贾教风格?))


code:

var
  a,b,c,w,next,an:array[0..50015] of longint;
  s,t,tot,n,m,i,x,y,z,ans,cost:longint;
  	q:array[0..2000000] of longint;
procedure spfa;
  var
    min,cos,h,e,i,p,x,y,z:longint;
	d,pre,path:array[0..5000] of longint;
	v:array[0..5000] of boolean;

  begin
    fillchar(path,sizeof(path),0);
	fillchar(pre,sizeof(pre),0);
    fillchar(v,sizeof(v),true);
	h:=1;e:=1;q[h]:=s;
	for i:=0 to t+10 do
	  d[i]:=maxlongint;
	d[s]:=0;v[s]:=false;
	pre[s]:=0;path[s]:=0;
	while(h<=e) do
	  begin
	    x:=q[h];
		p:=b[x];
		while p<>0 do
		  begin
		    y:=a[p];
		    z:=c[p];
			if ((d[x]+z)<d[y]) and (w[p]<>0) then	
			  begin
				d[y]:=d[x]+z;
				pre[y]:=x;
				path[y]:=p;
				if v[y] then
				  begin
			        e:=e+1;
					v[y]:=false;
                    q[e]:=y;
				  end;
			  end;
			p:=next[p];
		  end;
		v[x]:=true;
	    h:=h+1;
	  end;
	i:=t;min:=maxlongint;cos:=0;
	if path[i]=0 then exit;
	while i<>s do
	  begin
	    p:=path[i];
		cos:=cos+c[p];
		i:=pre[i];
		if w[p]<min then min:=w[p];		
	  end;
	i:=t;
	while i<>s do
	  begin
	    p:=path[i];
		w[p]:=w[p]-min;
		w[an[p]]:=w[an[p]]+min;
        i:=pre[i];
	  end;
	ans:=ans+min;
	cost:=cost+cos*min;
  end;
procedure insert(x,y,z,g,ww:longint);
  begin
    tot:=tot+1;
	next[tot]:=b[x];
	b[x]:=tot;
	a[tot]:=y;
	w[tot]:=ww;
	c[tot]:=z;
	an[tot]:=tot+g;
  end;

begin
  tot:=0;
  fillchar(b,sizeof(b),0);
  read(n,m);
  for i:=1 to m do
    begin
	  read(x,y,z);
	  if (x>n) or (y>n) then halt;
	  insert(x,y,z,1,1);
	  insert(y,x,-z,-1,0);
	  insert(y,x,z,1,1);
	  insert(x,y,-z,-1,0);
	end;
  s:=n+1;t:=n;
  insert(s,1,0,1,2);
  insert(1,s,0,-1,0);
  insert(1,s,0,1,2);
  insert(s,1,0,-1,0);
  ans:=0;
  cost:=0;
  spfa;
  spfa;
  writeln(cost);
end.

RP+++++

继续复习复习sap全优化的代码 学习平衡树(TT别人初中就会了,我现在还不会,太垃圾了啊啊啊啊)

【完美复现】面向配电网韧性提升的移动储能预布局与动态调度策略【IEEE33节点】(Matlab代码实现)内容概要:本文介绍了基于IEEE33节点的配电网韧性提升方法,重点研究了移动储能系统的预布局与动态调度策略。通过Matlab代码实现,提出了一种结合预配置和动态调度的两阶段优化模型,旨在应对电网故障或极端事件时快速恢复供电能力。文中采用了多种智能优化算法(如PSO、MPSO、TACPSO、SOA、GA等)进行对比分析,验证所提策略的有效性和优越性。研究不仅关注移动储能单元的初始部署位置,还深入探讨其在故障发生后的动态路径规划与电力支援过程,从而全面提升配电网的韧性水平。; 适合人群:具备电力系统基础知识和Matlab编程能力的研究生、科研人员及从事智能电网、能源系统优化等相关领域的工程技术人员。; 使用场景及目标:①用于科研复现,特别是IEEE顶刊或SCI一区论文中关于配电网韧性、应急电源调度的研究;②支撑电力系统在灾害或故障条件下的恢复力优化设计,提升实际电网应对突发事件的能力;③为移动储能系统在智能配电网中的应用提供理论依据和技术支持。; 阅读建议:建议读者结合提供的Matlab代码逐模块分析,重点关注目标函数建模、约束条件设置以及智能算法的实现细节。同时推荐参考文中提及的MPS预配置与动态调度上下两部分,系统掌握完整的技术路线,并可通过替换不同算法或测试系统进一步拓展研究。
先看效果: https://pan.quark.cn/s/3756295eddc9 在C#软件开发过程中,DateTimePicker组件被视为一种常见且关键的构成部分,它为用户提供了图形化的途径来选取日期与时间。 此类控件多应用于需要用户输入日期或时间数据的场景,例如日程管理、订单管理或时间记录等情境。 针对这一主题,我们将细致研究DateTimePicker的操作方法、具备的功能以及相关的C#编程理念。 DateTimePicker控件是由.NET Framework所支持的一种界面组件,适用于在Windows Forms应用程序中部署。 在构建阶段,程序员能够通过调整属性来设定其视觉形态及运作模式,诸如设定日期的显示格式、是否展现时间选项、预设的初始值等。 在执行阶段,用户能够通过点击日历图标的下拉列表来选定日期,或是在文本区域直接键入日期信息,随后按下Tab键或回车键以确认所选定的内容。 在C#语言中,DateTime结构是处理日期与时间数据的核心,而DateTimePicker控件的值则表现为DateTime类型的实例。 用户能够借助`Value`属性来读取或设定用户所选择的日期与时间。 例如,以下代码片段展示了如何为DateTimePicker设定初始的日期值:```csharpDateTimePicker dateTimePicker = new DateTimePicker();dateTimePicker.Value = DateTime.Now;```再者,DateTimePicker控件还内置了事件响应机制,比如`ValueChanged`事件,当用户修改日期或时间时会自动激活。 开发者可以注册该事件以执行特定的功能,例如进行输入验证或更新关联的数据:``...
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值