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别人初中就会了,我现在还不会,太垃圾了啊啊啊啊)

数据集介绍:垃圾分类检测数据集 一、基础信息 数据集名称:垃圾分类检测数据集 图片数量: 训练集:2,817张图片 验证集:621张图片 测试集:317张图片 总计:3,755张图片 分类类别: - 金属:常见的金属垃圾材料。 - 纸板:纸板类垃圾,如包装盒等。 - 塑料:塑料类垃圾,如瓶子、容器等。 标注格式: YOLO格式,包含边界框和类别标签,适用于目标检测任务。 数据格式:图片来源于实际场景,格式为常见图像格式(如JPEG/PNG)。 二、适用场景 智能垃圾回收系统开发: 数据集支持目标检测任务,帮助构建能够自动识别和分类垃圾材料的AI模型,用于自动化废物分类和回收系统。 环境监测与废物管理: 集成至监控系统或机器人中,实时检测垃圾并分类,提升废物处理效率和环保水平。 学术研究与教育: 支持计算机视觉与环保领域的交叉研究,用于教学、实验和论文发表。 三、数据集优势 类别覆盖全面: 包含三种常见垃圾材料类别,覆盖日常生活中主要的可回收物类型,具有实际应用价值。 标注精准可靠: 采用YOLO标注格式,边界框定位精确,类别标签准确,便于模型直接训练和使用。 数据量适中合理: 训练集、验证集和测试集分布均衡,提供足够样本用于模型学习和评估。 任务适配性强: 标注兼容主深度学习框架(如YOLO等),可直接用于目标检测任务,支持垃圾检测相关应用。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值