bzoj3996

本文详细介绍了一个基于最小割问题的算法实现过程,通过构建特定的网络流模型,利用SAP算法求解最大流,进而得到最小割。文章给出了完整的伪代码,并解释了如何根据输入的数据建立图模型。

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

把这个式子弄清楚就知道这是最小割了

相当于,选某个点i有收入ai,i,会损失ci,

如果i,j都被选则有额外收入ai,j+aj,i

明显,对每个点i,连(s,i,∑ai,j) (i,t,ci)

对每对i,j连边(i,j,ai,j),没了

  1 const inf=100000007;
  2 type node=record
  3        po,next,flow:longint;
  4      end;
  5 
  6 var e:array[0..2000010] of node;
  7     p,numh,h,cur,pre,d:array[0..510] of longint;
  8     t,len,ans,i,j,n,m,x,s:longint;
  9 
 10 procedure add(x,y,f:longint);
 11   begin
 12     inc(len);
 13     e[len].po:=y;
 14     e[len].flow:=f;
 15     e[len].next:=p[x];
 16     p[x]:=len;
 17   end;
 18 
 19 procedure build(x,y,f:longint);
 20   begin
 21     add(x,y,f);
 22     add(y,x,0);
 23   end;
 24 
 25 function min(a,b:longint):longint;
 26   begin
 27     if a>b then exit(b) else exit(a);
 28   end;
 29 
 30 function sap:longint;
 31   var u,i,j,tmp,neck,q:longint;
 32   begin
 33     numh[0]:=t+1;
 34     for i:=0 to t do
 35       cur[i]:=p[i];
 36     u:=0; sap:=0; neck:=inf;
 37     while h[0]<t+1 do
 38     begin
 39       d[u]:=neck;
 40       i:=cur[u];
 41       while i<>-1 do
 42       begin
 43         j:=e[i].po;
 44         if (e[i].flow>0) and (h[u]=h[j]+1) then
 45         begin
 46           neck:=min(neck,e[i].flow);
 47           pre[j]:=u;
 48           cur[u]:=i;
 49           u:=j;
 50           if u=t then
 51           begin
 52             sap:=sap+neck;
 53             while u<>0 do
 54             begin
 55               u:=pre[u];
 56               j:=cur[u];
 57               dec(e[j].flow,neck);
 58               inc(e[j xor 1].flow,neck);
 59             end;
 60             neck:=inf;
 61           end;
 62           break;
 63         end;
 64         i:=e[i].next;
 65       end;
 66       if i=-1 then
 67       begin
 68         dec(numh[h[u]]);
 69         if numh[h[u]]=0 then break;
 70         q:=-1;
 71         tmp:=t;
 72         i:=p[u];
 73         while i<>-1 do
 74         begin
 75           j:=e[i].po;
 76           if e[i].flow>0 then
 77             if tmp>h[j] then
 78             begin
 79               q:=i;
 80               tmp:=h[j];
 81             end;
 82           i:=e[i].next;
 83         end;
 84         h[u]:=tmp+1;
 85         inc(numh[h[u]]);
 86         cur[u]:=q;
 87         if u<>0 then
 88         begin
 89           u:=pre[u];
 90           neck:=d[u];
 91         end;
 92       end;
 93     end;
 94   end;
 95 
 96 begin
 97   len:=-1;
 98   fillchar(p,sizeof(p),255);
 99   readln(n);
100   t:=n+1;
101   for i:=1 to n do
102   begin
103     s:=0;
104     for j:=1 to n do
105     begin
106       read(x);
107       s:=s+x;
108       build(i,j,x);
109     end;
110     build(0,i,s);
111     ans:=ans+s;
112   end;
113   for i:=1 to n do
114   begin
115     read(x);
116     build(i,t,x);
117   end;
118   writeln(ans-sap);
119 end.
View Code

 

转载于:https://www.cnblogs.com/phile/p/4490746.html

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 “STC单片机电压测量”是一个以STC系列单片机为基础的电压检测应用案例,它涵盖了硬件电路设计、软件编程以及数据处理等核心知识点。STC单片机凭借其低功耗、高性价比和丰富的I/O接口,在电子工程领域得到了广泛应用。 STC是Specialized Technology Corporation的缩写,该公司的单片机基于8051内核,具备内部振荡器、高速运算能力、ISP(在系统编程)和IAP(在应用编程)功能,非常适合用于各种嵌入式控制系统。 在源代码方面,“浅雪”风格的代码通常简洁易懂,非常适合初学者学习。其中,“main.c”文件是程序的入口,包含了电压测量的核心逻辑;“STARTUP.A51”是启动代码,负责初始化单片机的硬件环境;“电压测量_uvopt.bak”和“电压测量_uvproj.bak”可能是Keil编译器的配置文件备份,用于设置编译选项和项目配置。 对于3S锂电池电压测量,3S锂电池由三节锂离子电池串联而成,标称电压为11.1V。测量时需要考虑电池的串联特性,通过分压电路将高电压转换为单片机可接受的范围,并实时监控,防止过充或过放,以确保电池的安全和寿命。 在电压测量电路设计中,“电压测量.lnp”文件可能包含电路布局信息,而“.hex”文件是编译后的机器码,用于烧录到单片机中。电路中通常会使用ADC(模拟数字转换器)将模拟电压信号转换为数字信号供单片机处理。 在软件编程方面,“StringData.h”文件可能包含程序中使用的字符串常量和数据结构定义。处理电压数据时,可能涉及浮点数运算,需要了解STC单片机对浮点数的支持情况,以及如何高效地存储和显示电压值。 用户界面方面,“电压测量.uvgui.kidd”可能是用户界面的配置文件,用于显示测量结果。在嵌入式系统中,用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值