POJ 1459

POJ1459解题报告 已经好几天没写解题报告了,今天年初一,呵呵,写一个,为今年开个好头。下面步入正题:POJ1459这道题目的要求是求最大的消耗量。我们添加一个源点s和一个汇点t,与s相连的是所有的np(生产点),边权值为其自己能产生的数值;与t相连的是所有的nc(消耗点),边权值为其消耗最大值。至此便完成了网络的构图。然后直接套用最大流的算法模版即可解决。我使用的是EK算法。什么是EK算法?EK算法的原理是 阅读详情

转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1299339754

 

提示:BFS找增广链 + 压入重标法

解题思路:

多源多汇最大流问题

 

题目给出很多都是废话,特别是符号s(u),d(u),Con还有那条公式都别管,混淆视听

难点在于构图

 

电站p(u)均为源点,用户c(u)均为汇点,中转站当普通点处理

 

第一个误区是例图, 结点 和 边 都有x/y(流量和容量),这个很容易使人产生矛盾(因为学习最大流问题是,只有 边 才有流量和容量。

     但是不难发现,题目所给的例图中有多个源点,多个汇点,多个普通点,只有源点和汇点才标有 x/y,普通点没有标x/y,而且所给出的所有边都有x/y。 这无疑在促使我们对图做一个变形: 建议一个超级源s,一个超级汇t,使s指向所有源点,并把源点的 容量y 分别作为这些边的 容量,使所有汇点指向t,并把汇点的容量y分别作为这些边的 容量,然后本来是源点和汇点的点,全部变为普通点。这样就把“多源多汇最大流”变形为“单源单汇最大流”问题。

第二个误区就是流量值。 学习最大流问题时,会发现边上的流量值是给定初始值的,但是这题的输入只有容量,没有流量,很多人马上感觉到无从入手。其实边上的流量初始值为多少都没有所谓,解最大流需要用到的只有容量。但是一般为了方便起见, 会把所有边的流量初始化为0。这样做有一个最大的好处,就是可以回避 反向弧 的存在,这个下面详细叙述。

 

本题中要注意的是:

1、  如果输入中,某一点上有环,就无视掉。环是否存在不影响最终结果。

2、  一般两点之间都是单边,一旦存在双边也没有问题,因为由定义知两个方向的容量一定相等(其实不相等也无妨,因为其中有一条为 反向弧,前面已经提到 反向弧 是可以直接回避、无视的,因此反向弧上的容量为多少就不重要了),而且在寻找增广路的标号过程中,搜索的是未标号的点,就是说(u,v)这条弧即使是双向的,但一旦从u到达v后,就不能回头了,因为两者都被标记了,即另外一条弧就不起任何作用了。

 

下面详细说说为什么能够回避反向弧。

首先需要明确,任意一个点j上记录的信息有:

1、  寻找增光路时,除超级源s外,增广路上任一点j都有一个唯一的前驱i(i被记录在j)

2、  min{从i到j的容流差,l(vi)}

3、  构图时,除超级汇t外,图上任一点j都会直接指向一些点(这些点作为后继点,同在记录在j)

 

从这个特点可以知道,从超级源开始寻找增广路时,万一遇到双向边,正向弧,反向弧自动被回避。万一遇到单向边,如果是非饱和正向弧,就会继续走下去;如果是反向弧,这条弧必然是 零弧(每条边初始化流量均为0),定义知如果增广路有反向弧,它必须要是非零弧,而且由于反向弧每次都不会经过,所以在改进增广路时反向弧上的流量也不会被改变,永远为0,也就与最终结果无关了

 

最后当无法寻找增广路时,最大流就是与超级源s直接关联的边上的 流量之和

 

 

  1. /*BFS+压入重标法*/  
  2.   
  3. //Memory  Time   
  4. //384K    860MS    
  5.   
  6. #include<iostream>  
  7. using namespace std;  
  8.   
  9. const int inf=10001;  
  10.   
  11. int n;  //总节点数  
  12. int np; //电站数  
  13. int nc; //用户数  
  14. int line;  //线路数  
  15. int cap[102][102];  //弧(u,v)的容量  
  16. int flow[102][102];  //弧(u,v)的流量  
  17. bool vist[102];   //标记点v是否已标号  
  18. int s,t;  //超级源,超级汇  
  19.   
  20. class info   //当前点v的标记信息  
  21. {  
  22. public:  
  23.     int pre;  //当前点v的前驱u  
  24.     int lv;  //l(v)  
  25.     int nei[101];  //当前结点直接指向的邻居结点  
  26.     int pn;  //邻居结点的指针  
  27. }node[102];  
  28.   
  29. int min(int a,int b)  
  30. {  
  31.     return a<b?a:b;  
  32. }  
  33.   
  34. void back(void)  
  35. {  
  36.     int x=t;  
  37.     while(x!=s)  
  38.     {  
  39.         flow[ node[x].pre ][x] += node[t].lv;  //改进增广路  
  40.         x=node[x].pre;  
  41.   
  42.     }  
  43.     return;  
  44. }  
  45.   
  46. bool bfs(void)  
  47. {  
  48.     memset(vist,false,sizeof(vist));  
  49.     node[s].pre=-1;  
  50.     node[s].lv=inf;  
  51.     vist[s]=true;  
  52.   
  53.     int queue[102];  
  54.     int head=0;  
  55.     int tail=0;  
  56.     queue[tail++]=s;  
  57.   
  58.     while(head<=tail-1)  //注意,这是再也找不到增广路的结束条件  
  59.     {  
  60.         int x=queue[head];  
  61.         int y;  
  62.         for(int i=0;i<node[x].pn;i++)  
  63.         {  
  64.             y=node[x].nei[i];  
  65.             if(!vist[y] && flow[x][y]<cap[x][y])   //搜索的目标要求是 未标记 & 非饱和弧  
  66.             {  
  67.                 queue[tail++]=y;  
  68.   
  69.                 vist[y]=true;  
  70.                 node[y].pre=x;  
  71.                 node[y].lv=min( node[x].lv , cap[x][y]-flow[x][y] );  
  72.             }  
  73.             if(vist[t])  //当超级汇被标记  
  74.                 break;  
  75.         }  
  76.         if(!vist[t])  
  77.             head++;  
  78.         else  
  79.             return true;  //搜索到一条增广路  
  80.     }  
  81.     return false;  
  82. }  
  83.   
  84. int main(int i,int j,int u,int v,int z,char temp)  
  85. {  
  86.     while(cin>>n>>np>>nc>>line)  
  87.     {  
  88.         /*Initial*/  
  89.   
  90.         s=n;  
  91.         t=n+1;  
  92.         for(i=0;i<n+1;i++)  
  93.             node[i].pn=0;  
  94.   
  95.         /*Input & Structure Maps*/  
  96.   
  97.         for(i=1;i<=line;i++)  
  98.         {  
  99.             cin>>temp>>u>>temp>>v>>temp>>z;  
  100.             if(u==v)  
  101.                 continue;   //不需要环  
  102.             cap[u][v]=z;  
  103.             flow[u][v]=0;   //每条边的流量都初始化为0  
  104.             node[u].nei[ node[u].pn++ ]=v;  
  105.         }  
  106.         for(i=1;i<=np;i++)  
  107.         {  
  108.             cin>>temp>>v>>temp>>z;  
  109.             cap[s][v]=z;     //建立超级源,指向所有电站  
  110.             flow[s][v]=0;  
  111.             node[s].nei[ node[s].pn++ ]=v;  
  112.         }  
  113.         for(i=1;i<=nc;i++)  
  114.         {  
  115.             cin>>temp>>u>>temp>>z;  
  116.             cap[u][t]=z;     //建立超级汇,被所有用户指向  
  117.             flow[u][t]=0;  
  118.             node[u].nei[ node[u].pn++ ]=t;  
  119.         }  
  120.   
  121.         /*标号法找增广轨*/  
  122.   
  123.         while(true)  
  124.         {  
  125.             if(bfs())  //如果能搜到到增广路  
  126.                 back();  //从超级汇开始回溯,改进增广路  
  127.             else  
  128.             {  
  129.                 int max=0;        //输出最大流  
  130.                 for(i=0;i<node[s].pn;i++)  
  131.                     max+=flow[s][ node[s].nei[i] ];  
  132.                 cout<<max<<endl;  
  133.                 break;  
  134.             }  
  135.         }  
  136.     }  
  137.     return 0;  
  138. } 

本人喜爱版本:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define M 105
#define INF 900000000
int cap[M][M];
int flow[M][M];
int queue[M];
int link[M],l[M];
int n,np,nc,line;
bool vist[M];
int s,t;

void read()
{
	memset(cap,-1,sizeof(cap));

	int i,u,v,z;
	char temp;
	for(i=0;i<line;i++)
	{
		cin>>temp>>u>>temp
			>>v>>temp>>z;
		if(u==v)
		{
			continue;
		}
		cap[u][v]=z;
	}

	for(i=0;i<np;i++)
	{
		cin>>temp>>u>>temp>>z;
		cap[s][u]=z;
	}

	for(i=0;i<nc;i++)
	{
		cin>>temp>>u>>temp>>z;
		cap[u][t]=z;
	}
}

void back()
{
	int x=t;
	while(x!=s)
	{
		flow[ link[x] ][x] +=l[t];
		x=link[x];
	}
}

bool bfs()
{
	memset(vist,0,sizeof(vist));
	l[s]=INF;
	vist[s]=true;

	int head=0;
	int tail=0;
	queue[tail++]=s;
	
	int i,x;
	while(head<tail)
	{
		x=queue[head];
		
		for(i=0;i<=t;i++)
		{
			if(cap[x][i]!=-1&&!vist[i]&&flow[x][i]<cap[x][i])
			{
				queue[tail++]=i;

				vist[i]=true;
				link[i]=x;
				l[i]=min( l[x],cap[x][i]-flow[x][i] );
			}
			if(vist[t])
			{
				return true;
			}
		}
		head++;
	}
	return false;
}

void cal()
{
	memset(flow,0,sizeof(flow));
	while(true)
	{
		if(bfs())
		{
			back();
		}
		else
		{
			break;
		}
	}
}

void answer()
{
	int i,ans=0;
	for(i=0;i<=t;i++)
	{
		if(cap[s][i]!=-1)
		{
			ans+=flow[s][i];
		}
	}
	printf("%d\n",ans);
}

int main()
{
	while(~scanf("%d%d%d%d",&n,&np,&nc,&line))
	{
		s=n;
		t=n+1;
		read();
		cal();
		answer();
	}
	return 0;
}



解密OpenVLA的ActionTokenizer:如何用256个Token控制7维机器人动作 本文深入解析了OpenVLA模型中ActionTokenizer的核心机制。该分词器通过将7维连续机器人动作空间离散化为256个Token,巧妙地解决了大语言模型输出精确控制指令的难题。文章详细阐述了其设计哲学、与Llama-2词表的集成方式,并分析了256个离散区间在精度与效率间的平衡,为机器人视觉-语言-动作控制提供了关键技术桥梁。 阅读详情

相关推荐

驱动钛丝(SMA)的应用(5)汽车腰托气阀常见问题及解决方案

财哥在前段时间发布的《驱动钛丝(SMA)的应用(1)汽车腰托支撑按摩气阀模块》一文,引发了很多企业的拜访和交流。 目前很多厂家已经启动或正在进行相关研发,同时也遇到了诸如:钛丝选型、驱动位移、响应设计、温度控制、力量设计、点动滞后、铆接工艺、量化生产等问题。

weixin_39168671的博客 1245

poj 1459(最大流)

<br />题意:在一个电路系统中有发电厂,有用电者,有变电站,发电厂只能生产电不能用电,用电者只能用电不能生产电,变电站只能传输电。<br /> <br />思路:这是一道很明显的最大流。建立一个超级源点0,从0到各个发电站建立一条容量为发电站产电数额的边,以保证每个发电站供出的电小于或等于自己的产电数额;建立一个超级汇点n+1,从各个用电者到n+1建一条容量为用电者最多用电数额的边;然后对题中给定的m个triplets建边。最后从0到n+1求最大流。<br /> <br />参考代码:<br />#in

tangmenghui的专栏 426

车辆TBOX科普 第7次 TBOX技术深度解析:硬件架构与核心组件详解

摘要: TBOX(车载远程信息处理单元)是智能网联汽车的核心组件,承担数据采集、通信连接与安全交互等关键功能。其硬件架构以主控单元为核心,采用ARM架构处理器(如NXP i.MX系列)实现高效能低功耗处理,搭配DDR4/LPDDR5内存保障性能,eMMC/UFS存储确保数据可靠性。设计中需平衡车规级可靠性(AEC-Q100)、EMC兼容性及成本控制,同时集成通信、定位与安全模块。未来趋势聚焦异构计算、先进制程及功能安全(ASIL-D)与信息安全融合,推动TBOX向边缘计算节点演进。该技术是汽车智能化转型的重

IT深耕十余载,大道之简 864

POJ--1459[Power Network] 网络最大流

分析:多源最大流问题,可以构造成一般最大流问题,增加一个超级源点s和一个超级汇点t即可。起点指向每个Power station,边的权值为Power station的Pmax。每个Consumer指向终点,边的权值为Cmax。Dispatcher看做一般节点。 感想:分别用EK和

___简言 667

5060TI显卡深度学习环境搭建:CUDA12.8与CUDNN9.8.0的完美搭配

本文详细介绍了在Win10系统下为5060TI显卡搭建深度学习环境的最佳实践,重点配置CUDA12.8与CUDNN9.8.0的完美组合。通过优化OpenCV编译选项和YOLOv5环境设置,显著提升模型训练和推理效率,帮助开发者充分发挥5060TI显卡的性能潜力。

weixin_29065791的博客 491

PowerBuilder 9.0安装组件全解析:Adaptive Server Anywhere、PowerDynamo、InfoMaker到底怎么选?

本文从技术架构师视角详细解析PowerBuilder 9.0安装组件选型策略,包括Adaptive Server Anywhere、PowerDynamo和InfoMaker的核心功能与应用场景。通过分析组件间的依赖关系和安装冲突机制,提供针对不同开发需求的最佳安装方案,帮助开发者高效配置PB9.0开发环境。

weixin_28700593的博客 443

poj 1459 多源点与汇点的最大流

题目:poj 1459 ps:题目看得我很难受,建议只看input output,还有那个输入我也是很难受 题目大意: 总共有n个点,有np个点是发电站,nc个点是消费电的,m条线,其他点只起到传输的作用 题目会给出np发电站有多少电,nc个消费电的地方最多消费多少电,然后要求出总的最大的消费电的值 题解: 多源点与汇点的模板题 蓝色为发电站,红色为消费电的地方,忽略中间的点 增加...

forOnward的博客 514

国科GK7202V300芯片开发避坑指南:从uboot编译到SDK配置的12个实战问题解决

本文针对国科GK7202V300芯片开发过程中的常见难题,提供从uboot编译、SDK配置到系统部署的实战解决方案。详细解析了开发环境搭建、内核编译、驱动模块加载、根文件系统构建及烧写部署等12个关键环节的避坑指南,帮助开发者高效解决编译错误、配置冲突等典型问题,提升开发效率。

sunny的博客 237

【最大流 模板 Dinic】POJ 1459 Power Network

Problem Description 给你n, np, nc, m。分别代表有n个点,其中np个是发电站,nc个是消费者,剩下n-np-nc个就是中转站。接下来给你m条边,每条边格式(u,v)w。代表u点到v点这条线路最大能够运输w的电。最后给你np个点最大能够输出的电,nc个点最大能够接收的电(格式:(u)w, u这个点能够输出(接收)最大的电,发电站的点是输出,消费者的点是接收)。 思路:

ACMer 梁剑锋 的博客 372

TI 实时操作系统SYS/BIOS使用总结

1:概述: SYS/BIOS 是一个可扩展的实时的操作系统。具有非常快速的响应时间(在中断和任务切换时达到较短的延迟),响应时间的确定性,强壮的抢占系统,优化的内存分配和堆栈管理(尽量少的消耗和碎片)。能够实现系统的模块化并可裁剪。 最大的特点就是:实时。 2:XDCtools: XDCtools 是SYS/BIOS引用的一种实时的软件组件技术(RTSC),它包括一些有用的工具,标准的AP

带头奋青的博客 5万+

YOLO11改进-注意力-引入多尺度注意力聚合(MSAA)模块

对来自backbone的特征进行细化处理。通过空间和通道两个路径的操作,增强了空间和通道方面的特征信息,使得输出的特征图在空间和通道维度上都更加优质。1. 在空间细化路径中,通过对不同核大小的卷积进行求和以及一系列的空间特征聚合操作,实现了多尺度空间信息的融合。2. 在通道聚合路径中,通过全局平均池化、卷积和激活等操作生成通道注意力图,并与空间细化后的图相结合,实现了通道维度上的多尺度信息融合。

qq_64693987的博客 4679

poj1459--Power Network(最大流EK、)

Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 23114   Accepted: 12103 Description A power network consists of nodes (power stations, consumers

随风的专栏 1087

手把手实现STM32+ESP8266+原子云服务器+手机APP应用——第三节-编写STM32程序实现STM32+ESP8266+原子云服务器+手机APP互相通信—远程数据传输及控制灯

接上一篇,本节使用原子云服务器。编写STM32程序实现STM32+ESP8266+原子云服务器+手机APP互相通信—远程数据传输及控制灯。使用的硬件包括:STM32F103(任意其他款系列也可以的)、正点原子ATK-ESP8266、LED灯。实现编写STM32程序代码来传输单片机数据到原子云服务器和手机APP进行显示,同时通过手机APP和原子云服务器可以远程控制单片机,例如本节实现远程点/灭灯,以此可以扩展开发更多的功能。本专栏本系列的相关文章可查看下面链接:

嵌入式阿齐Archie 8416

POJ 1459 Power Network

链接:http://poj.org/problem?id=1459 题目: Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 21928   Accepted: 11453 Description A power netwo

u010084308的专栏 838

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

poj1459多源点网络流入门

poj1459多源点网络流入门 题目链接:http://poj.org/problem?id=1459 题目部分 题意: 简单的说下题意(按输入输出来讲,前面的描述一堆的rubbish,还用来误导人),给你n个点,其中有np个是能提供电力的点,nc个是能消费电力的点,剩下的点(n-np-nc)是中转战即不提供电力也不消费电力,点与点之间是有线路存在的,有m条线路,每条线路有最多运载限定。 前4个

formicary的专栏 3425

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

EK算法解决POJ 1459

POJ 1459http://poj.org/problem?id=1459 题意: 给几个发电站,给几个消耗站,再给几个转发点。发电站只发电,消耗站只消耗电,转发点只是转发电,再给各个传送线的传电能力。问你消耗站能获得的最多电是多少。 //方法如下: //虚拟出源点0和汇点n+1; 将所有的源点与0相连,将所有的汇点和n+1相连 #include <iostream>#i...

weixin_30815427的博客 139

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Poj 1459 Power Network 最大流

Poj的1459题Power Network,很敏

liulingbo918 897

POJ 1459 最大流 Dinic

题意 传送门 POJ 1459 题解 题目描述天花乱坠,其实就是求发电机到消费者的多源点、多汇点的最大流;加入超级源点、超级汇点跑 DinicDinicDinic 即可。 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <queue> #include <vector> #include <cmath&gt

neweryyy的博客 183

POJ 1459 Power Network——(网络流入门)

POJ 1459 Power Network题目链接:http://poj.org/problem?id=1459I/O坑爹。。一开始的想法:理论虽然简单,实现起来怀疑人生。问题主要在于用什么模型存储网络,并且可以快速读写(这是核心问题)。用矩阵存储一直TLE,后来一直想用map,但是感觉还是不行,最后还是换成链表了。第一次写的,用矩阵存储。一直TLE,我以为矩阵费时间,,后来发现神tm居然控制台...

rsy56640的博客 266

poj 1459 Power Network

POJ1459  Power Network  点击打开链接 大致题意: 题蛮长的,但是一堆废话,我读了三遍才懂。 现在有np个发电站,每个发电站能生产最多P电量。有nc个顾客,每个顾客能消耗最大C电量。 其余的点代表转电站,既不消耗也不生产。每两个点之间有一条输电线,最大输送电量为L。 现在问,所有的顾客消耗的总电量最大是多少。。。 这道题就是求最大流,不过源点不唯一,汇点不唯一,不

zyy.cpp 的博客 496

poj 1459 最大流(Dinic)

/************************************************************************* > File Name: poj1459.cpp > Author: cy > Mail: 1002@qq.com > Created Time: 2014/9/24 21:02:55 **************

caoyu01 542

poj 1459 多源点网络流入门题

poj1459多源点网络流入门 题目链接:http://poj.org/problem?id=1459 题目部分 题意: 简单的说下题意(按输入输出来讲,前面的描述一堆的rubbish,还用来误导人),给你n个点,其中有np个是能提供电力的点,nc个是能消费电力的点,剩下的点(n-np-nc)是中转战即不提供电力也不消费电力,点与点之间是有线路存在的,有m条线路,每条线路有最

nankeyimeng的博客 1114

No.23 - POJ1459 邻接矩阵网络流

// ShellDawn // POJ1459 // No.23 #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #define MM(x) memset(x,0,sizeof(x)) #define IN...

ShellDawn的博客 219

poj 1459 Power Network 最大流

题目:http://poj.org/problem?id=1459 题意:给几个发电站,几个消耗站,几个转发点。发电站只发电,消耗站只消耗电,转发点只是转发电,再给各个传送线的传电能力。问你消耗站能获得的最多电是多少 思路:题意有点复杂,思路很简单,建图直接跑最大流 #include #include #include #include #include #include #in

弱智就要多努力 536

POJ 1459 Power Network(最大流)

POJ 1459 Power Network(最大流) http://poj.org/problem?id=1459 题意:        (原题描述的过于复杂,原题中的s[i]根本不用管)总共有n个节点,其中有发电站np个、用户nc个和调度器n-np-nc个三种节点以及M条电线(用于传输电流的),每个发电站有一个最大发电量,每个用户有个最大接受电量,现在有m条有向边,边有一个最大的电流量,

code 1146

poj1459 多源多汇最大流

题目链接:http://poj.org/problem?id=1459 题目意思让我放弃了好几回,今天终于耐下心来读懂了 就不说题目意思了 看看输入输出: Sample Input 2 1 1 2 (0,1)20 (1,0)10 (0)15 (1)20 7 2 3 13 (0,0)1 (0,1)2 (0,2)5 (1,0)1 (1,2)8 (2,3)1 (2,4)7 ...

weixin_30686845的博客 170
上一篇: POJ 3020 二分匹配
下一篇: POJ 2299 归并排序
MakingMaker
博客等级 码龄15年 6粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值