jzoj3302-[集训队互测2013]供电网络【上下界网络流,费用流,动态加边】

正题


题目大意

若干个城市一些城市有一定的电,有些城市需要一定的电。对于第iii个城市购买一个电需要iniin_iini,送出电需要outiout_iouti。当然城市之间也可以相互传输电。

对于一条电缆(x,y,a,b,l,r)(x,y,a,b,l,r)(x,y,a,b,l,r)表示x−>yx->yx>y的单向传输,传输kkk个的话要ak2+bkak^2+bkak2+bk,传输电量的上下界为[l..r][l..r][l..r]

要求每个城市都没有多余也不缺少电,求最小代价。


解题思路

显然费用流。

首先流量表示电(十分显然)。

因为有上下界所以我们动态开点且费用流时每次只流一个流量。

然后我们考虑如何构图。

购买:s−>is->is>i流量为infinfinf费用为iniin_iini
送出:i−>ei->ei>e流量为infinfinf费用为outiout_iouti

但是我们会发现流量是无限大的。

这时我们就要考虑了,因为流量是一个一个流的,只要我们让流量每次都优先是使用原来的就可以了

多余(left>0):s−>i(left>0):s->i(left>0):s>i流量为leftleftleft费用为−inf-infinf
缺少(left&lt;0):s−&gt;i(left&lt;0):s-&gt;i(left<0):s>i流量为−left-leftleft费用为−inf-infinf

这样就可以保证每次优先流已经有的,直到我们发现最小费用的路径长度大于000就可以退出了(因为这时已经没有需要补充也没有多余的电了)。

但是这样费用就是负数了。其实我们只要把多出的−inf-infinf减去就好了。也就是(ans%inf+inf)%inf(ans\%inf+inf)\%inf(ans%inf+inf)%inf

之后我们考虑连边,因为有上下界,对于每条边(x,y,a,b,l,r)(x,y,a,b,l,r)(x,y,a,b,l,r)
我们可以让leftxleft_xleftx减去lllleftyleft_ylefty加上lll。也就是让lll开始就流走并直接统计入费用当中。

之后我们考虑费用,我们将ak2+bkak^2+bkak2+bk分成若干条流量为1的边,然后每次费用为ak2+bk−a(k−1)2−b(k−1)ak^2+bk-a(k-1)^2-b(k-1)ak2+bka(k1)2b(k1)也就是a+b,3a+b,5a+b,7a+b......a+b,3a+b,5a+b,7a+b......a+b,3a+b,5a+b,7a+b......。然后根据最小费用原则,若这条边要走kkk个流量,那必定是前kkk条。

结束,但是这样会TLETLETLE。这时我们就需要动态开点。

首先我们对于每条边先只连接着一条边,当新的流量流过这条边时我们就在增加一条边。


codecodecode

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define p(x,y) (x*10-4+y)
#define ll long long
using namespace std;
const ll N=210,M=610,inf=1000000;
struct node{ll to,next,w,c;
}a[M*20];
ll n,m,ls[N],s,e,tot=1,sum,left[N],cost[N][N];
ll pre[N],f[N],x[M],y[M],L[M],A[M],B[M],U[M];
bool v[N];
queue<ll> q;
void addl(ll x,ll y,ll w,ll c)
{a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;a[tot].c=c;a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;a[tot].c=-c;
}
void change()
{for(ll i=1;i<=m;i++)if(cost[x[i]][y[i]]==L[i]&&L[i]<U[i])L[i]++,addl(x[i],y[i],1,A[i]*(2*L[i]-1)+B[i]);
}
bool spfa()
{change();memset(f,0x3f,sizeof(f));q.push(s);v[s]=1;f[s]=0;while(!q.empty()){ll x=q.front();q.pop();v[x]=0;for(ll i=ls[x];i;i=a[i].next){if(!a[i].w) continue;ll y=a[i].to;if(f[x]+a[i].c<f[y]){pre[y]=i;f[y]=f[x]+a[i].c;if(!v[y])q.push(y),v[y]=1;}}}return f[e]<=0;
}
void count_cost()
{ll now=e;sum+=f[e];while(now!=s){ll x=a[pre[now]^1].to,y=a[pre[now]].to;a[pre[now]].w--;a[pre[now]^1].w++;cost[x][y]++;cost[y][x]--;now=a[pre[now]^1].to;}
}
void net_flow()
{while(spfa())count_cost();
}
int main()
{scanf("%lld%lld",&n,&m);s=n+1;e=s+1;for(ll i=1;i<=n;i++){ll in,out;scanf("%lld%lld%lld",&left[i],&in,&out);addl(s,i,inf,in);addl(i,e,inf,out);}for(ll i=1;i<=m;i++){scanf("%lld%lld%lld%lld%lld%lld",&x[i],&y[i],&A[i],&B[i],&L[i],&U[i]);left[x[i]]-=L[i];left[y[i]]+=L[i];sum+=A[i]*L[i]*L[i]+B[i]*L[i];cost[x[i]][y[i]]+=L[i];cost[y[i]][x[i]]-=L[i];}for(ll i=1;i<=n;i++){if(left[i]>0) addl(s,i,left[i],-inf);else addl(i,e,-left[i],-inf);}net_flow();sum=sum%inf;if(sum<0) sum+=inf;printf("%lld",sum);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis生成器插件扩展,生成findInSet方法

Mybatis生成器插件扩展&#xff0c;生成findInSet方法 public Criteria andNameFindInSet(String value) {addCriterionPattern("find_in_set($value, name)", value, "name");return (Criteria) this;}public Criteria andNamePattern(String pattern, S…

[认证授权] 6.Permission Based Access Control

在前面5篇博客中介绍了OAuth2和OIDC&#xff08;OpenId Connect&#xff09;&#xff0c;其作用是授权和认证。那么当我们得到OAuth2的Access Token或者OIDC的Id Token之后&#xff0c;我们的资源服务如何来验证这些token是否有权限来执行对资源的某一项操作呢&#xff1f;比如…

P4841,jzoj3303-城市规划【NTT,多项式求逆,dp】

正题 题目链接:https://www.luogu.org/problemnew/show/P4841 题目大意 求nnn个点的简单联通无向图的个数。 解题思路 首先考虑n2n^2n2&#xff0c;我们设gig_igi​表示iii个点的简单无向图的个数&#xff0c;显然gi2n(n−1)2g_i2^{\frac{n(n-1)}{2}}gi​22n(n−1)​ 然后我…

微软发布PowerShell Core第一个版本:支持多平台开发

微软旗下的PowerShell团队正式宣布推出PowerShell Core 6.0&#xff0c;非常诡异的是这明明是Core的第一个版本&#xff0c;但是却用了一个6.0后缀的版本号。“这是我们对PowerShell做出的最大最重要的改变&#xff01;”微软技术研究员兼PowerShell创始人Jeffrey Snover在Twit…

Mybatis生成器插件扩展,定制方法生成,list参数生成

Mybatis生成器插件扩展&#xff0c;定制方法生成 public Criteria andNameIsEmpty() {addCriterion("name ");setCriterionPattern();return (Criteria) this;}public Criteria andNameFindInSet(String value) {addCriterion("find_in_set($value, name)"…

欢乐纪中某A组赛【2019.7.5】

前言 被花式暴虐&#xff0c;T1T1T1签到后两题神仙 成绩 JJJ表示初中&#xff0c;HHH表示高中后面加的是几年级 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC111(J−3)ZZY(J-3)ZZY(J−3)ZZY200200200100100100100100100000888(J−3)WHF(J-3)WHF(J−3)WHF145145145…

Mybatis生成器插件扩展,生成OR操作

Mybatis生成器插件扩展&#xff0c;生成OR操作 ManExample example new ManExample();ManExample.Criteria and example.createCriteria();and.andNameIsEmpty().andNameFindInSet("a").andNameFindInSetIn(Arrays.asList("1", "2", "3&q…

.NET Core单文件发布静态编译AOT CoreRT

.NET Core单文件发布静态编译AOT CoreRT&#xff0c;将.NET Core应用打包成一个可执行文件并包含运行时。支持Windows, MacOS and Linux x64 w/ RyuJIT codegen。示例项目&#xff1a;https://github.com/dotnet/corert/tree/master/samples/WebApi下面来实际体验。首先确保安装…

2019纪中暑假游记+总结

Travels总篇\texttt{Travels总篇}Travels总篇 7/4\texttt{7/4}7/4 下午才去纪中&#xff0c;早上就一大早和同学出去玩&#xff0c;看了蜘蛛侠然后到3点多才出发。 因为走南沙大桥所以很快就到了(具体有多快忘了&#xff0c;反正路上一点都不塞车)。就愉快的去整理宿舍洗个早…

使用xUnit为.net core程序进行单元测试(上)

一. 导读为什么要编写自动化测试程序&#xff08;Automated Tests&#xff09;&#xff1f;可以频繁的进行测试可以在任何时间进行测试&#xff0c;也可以按计划定时进行&#xff0c;例如&#xff1a;可以在半夜进行自动测试。肯定比人工测试要快。可以更快速的发现错误。基本上…

select2删除选中项,allowClear设置

转载自 select2删除选中项&#xff0c;allowClear设置 在使用select2过程中&#xff0c;有时候需要删除我们选中的选项&#xff0c;如下图&#xff1a; 这时候就需要设置select2的allowClear属性了。 有两种方法&#xff1a; 第一种&#xff1a; 直接用select2定义的一个c…

jzoj2679-跨时代【背包,dfs,状压】

正题 题目大意 若干根棍子&#xff0c;不能折&#xff0c;不能多余求能够组成的最大长方形。 解题思路 首先我们发现如果棍子集合SSS长度为lll且它有子集GGG长度为l2\frac{l}{2}2l​那么就表示这个集合的棍子可以作为一个矩形的对应两边&#xff0c;这样我们只要枚举两个不相…

LeetCode算法总结-回溯法与深度优先搜索

转载自 LeetCode算法总结-回溯法与深度优先搜索 回溯法&#xff08;探索与回溯法&#xff09;是一种选优搜索法&#xff0c;又称为试探法&#xff0c;按选优条件向前搜索&#xff0c;以达到目标。但当探索到某一步时&#xff0c;发现原先选择并不优或达不到目标&#xff0c;就…

Mybatis的配置与使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、Mybatis所用jar包二、使用步骤1.配置mybatis.xml文件2.创建与数据库对应的po类&#xff0c;提供get、set、toString方法3.创建与Dept对应的接口类&#xff1…

入门干货之用DVG打造你的项目主页-Docfx、Vs、Github

由于这三项技术涉及到的要点以及内容较多&#xff0c;希望大家有空能自己挖掘一下更多更深的用法。0x01、介绍VS&#xff0c;即VS2017以及以上版本&#xff0c;宇宙最好的IDE&#xff0c;集成了宇宙最有前景的平台&#xff0c;前阶段也支持了宇宙最好的语言。Github&#xff0c…

P2579,jzoj2288-[ZJOI2005]沼泽鳄鱼【矩阵乘法】

正题 题目链接:https://www.luogu.org/problemnew/show/P2579 题目大意 一张无向图&#xff0c;一个起点一个终点。 有食人鱼&#xff0c;在若干个点之间有周期的移动&#xff0c;周期为222或333或444个点为循环。 然后要求从起点到终点走kkk步且不碰到食人鱼的方案数。 解…

ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)

前言本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期.这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度.正文今天我们主要讲讲如何使用自带IOC容器,emm..虽然自带的功能不是那么强大,但是胜在轻量级..而且..不用引…

P4130,jzoj1214-[NOI2007]项链工厂【线段树】

正题 题目链接:https://www.luogu.org/problemnew/show/P4130 题目大意 一个环形颜色珠子链&#xff0c;位置(注意不是上面的珠子)从最上顺时针下来位置依次标号1∼n1\sim n1∼n。 然后要求支持以下操作 Rk:R\ k:R k:将所有珠子顺时针旋转kkk个。F:F:F:将所有珠子以111向下翻…

LeetCode常用算法模式大厂面试题整理

转载自 LeetCode常用算法模式&大厂面试题整理 文章目录 1、滑动窗口 2、双指针 3、快慢指针 4、合并区间 5、循环排序 6、就地反转链表 7、堆-优先队列问题 8、Top K 9、归并 10、单调栈 11、回溯法 BATJ等大厂面试真题汇总 1、滑动窗口 1 一个左指针&#xff0c;一个右…