题目传送门(内部题18)


输入格式

第一行包括四个数$n,m,k,s$表示有$n$个剧情点,$m$个关卡,要玩$k$次游戏,$s$个完结点接下来一行包含$s$个数,代表$s$个完结点的编号。
接下来$m$行,每行五个正整数$x_i,y_i,A_i,B_i,C_i$,代表第$i$号关卡从$x_i$号剧情点连向$y_i$号剧情点,$A_i,B_i,C_i$意义如题目描述。


输出格式

如果不能通关输出$-1$,否则输出一个整数,代表至少需要的软妹币值。


样例

样例输入:

6 8 2 2
4 5
1 2 4 0 2
1 3 5 0 2
3 4 1 5 1
2 5 1 0 1
4 6 4 2 2
5 6 0 4 2
1 5 5 9 2
2 6 4 5 2

样例输出:

16


数据范围与提示

样例解释:

第一次从$1−>2−>5$,费用为$5$。
第二次从$1−>3−>4$,费用为$11$。

数据范围:

对于$30\%$的数据,$A_i=0$。
对于另外$20\%$的数据,游戏为一条链。
对于$100\%$的数据,$1\leqslant n\leqslant 1,000,1\leqslant m\leqslant 20,000,1\leqslant k\leqslant 200,A_i,B_i\geqslant 0,1\leqslant C_i\leqslant k$。
保证答案在$int$范围内。


题解

注意到$k$只有200,但是又有谁能想到是费用流呢?

实际上,我的思路和题解稍有偏差。

建边的时候记录上边的$A,B$,每走一次就让花费增加,退流的时候再剪掉就好了,缺点就是每次只能流一个,不然有可能会错过最优答案。

时间复杂度:$\Theta(m\times k+n\times k^2)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
struct rec
{
int nxt;
int to;
int w;
int f;
int a;
}e[100001];
int head[5001],cnt=1;
int n,m,k,s;
int S,T;
int que[100001],pre[50001],dis[50001];
bool vis[50001];
int ans;
void add(int x,int y,int w,int f,int a)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
e[cnt].w=w;
e[cnt].f=f;
e[cnt].a=a;
head[x]=cnt;
}
bool bfs()
{
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[S]=0;
vis[S]=1;
int he=1,ta=1;
que[ta]=S;
while(he<=ta)
{
for(int i=head[que[he]];i;i=e[i].nxt)
if(e[i].w&&dis[que[he]]+e[i].f<dis[e[i].to])
{
dis[e[i].to]=dis[que[he]]+e[i].f;
pre[e[i].to]=i;
if(!vis[e[i].to])
{
vis[e[i].to]=1;
que[++ta]=e[i].to;
}
}
vis[que[he]]=0;
he++;
}
return dis[T]!=1061109567;
}
void update()
{
int flag=T;
while(flag!=S)
{
int x=pre[flag];
ans+=e[x].f;
e[x].w--;
e[x^1].w++;
e[x].f+=e[x].a;
e[x^1].f-=e[x].a;
flag=e[x^1].to;
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&k,&s);
S=n+1,T=n+2;
add(S,1,k,0,0);
add(1,S,0,0,0);
for(int i=1;i<=s;i++)
{
int x;
scanf("%d",&x);
add(x,T,k,0,0);
add(T,x,0,0,0);
}
for(int i=1;i<=m;i++)
{
int x,y,a,b,c;
scanf("%d%d%d%d%d",&x,&y,&a,&b,&c);
add(x,y,c,b+a,a);
add(y,x,0,-b,a);
}
cnt=0;
while(bfs())
{
update();
cnt++;
}
if(cnt<k)puts("-1");
else printf("%d",ans);
return 0;
}

rp++

[CSP-S模拟测试]:壕游戏(费用流)的更多相关文章

  1. BZOJ5120 [2017国家集训队测试]无限之环 费用流

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5120 题意概括 原题挺简略的. 题解 本题好难. 听了任轩笛大佬<国家队神犇>的讲课才 ...

  2. BZOJ 5120: [2017国家集训队测试]无限之环(费用流)

    传送门 解题思路 神仙题.调了一个晚上+半个上午..这道咋看咋都不像图论的题竟然用费用流做,将行+列为奇数的点和偶数的点分开,也就是匹配问题,然后把一个点复制四份,分别代表这个点的上下左右接头,如果有 ...

  3. [CSP-S模拟测试]:矩阵游戏(数学)

    题目描述 $LZK$发明一个矩阵游戏,大家一起来玩玩吧,有一个$N$行$M$列的矩阵.第一行的数字是$1,2,...,M$,第二行的数字是$M+1,M+2,...,2\times M$,以此类推,第$ ...

  4. [CSP-S模拟测试]:城市游戏(图论+DP)

    题目传送门(内部题109) 输入格式 第一行,两个整数$n,m$. 接下来$m$行,每行三个整数$u,v,l$,描述了一条道路连接的两个路口的编号以及道路的长度. 输出格式 输出一行一个整数,为所求的 ...

  5. 【bzoj3291】Alice与能源计划 模拟费用流+二分图最大匹配

    题目描述 在梦境中,Alice来到了火星.不知为何,转眼间Alice被任命为火星能源部长,并立刻面临着一个严峻的考验. 为了方便,我们可以将火星抽象成平面,并建立平面直角坐标系.火星上一共有N个居民点 ...

  6. 【wikioi】1033 蚯蚓的游戏问题(费用流)

    http://wikioi.com/problem/1033/ 这题也是很水的费用流啊,同之前那题一样,拆点然后建边,容量为1,费用为点权.然后建个源连第一行每个点,容量为1,费用为0,然后最后一行每 ...

  7. 【bzoj1150】[CTSC2007]数据备份Backup 模拟费用流+链表+堆

    题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏 ...

  8. BZOJ1150[CTSC2007]数据备份Backup——模拟费用流+堆+链表

    题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游 ...

  9. 【BZOJ1150】[CTSC2007]数据备份Backup 双向链表+堆(模拟费用流)

    [BZOJ1150][CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此 ...

随机推荐

  1. datastudio 里关于with as 的用法。

    datastudio 里sql 语句的写法,加入with as 语法. 这样方便查询,易于维护.以后都这样写. 优点: 1 易于维护,可以复用代码块 2 优化书写逻辑,方便查阅理解. 3  性能方面优 ...

  2. RSA - 原理、特点(加解密及签名验签)及公钥和私钥的生成

    Wiki - RSA加密演算法 Wiki - 欧拉函数 Wiki - 模反元素 ASN.1 格式标准 RSA算法原理(二) 注意: RSA 加密或签名后的结果是不可读的二进制,使用时经常会转为 BAS ...

  3. mysqladmin - 管理 MySQL 服务器、获取运行状态

    官方文档 mysqladmin 是管理 MySQL 服务器的客户端,可以用来检测服务器的配置和当前状态.创建和删除数据库等. 1. mysqladmin 的调用语法 shell> mysqlad ...

  4. JSP中四种属性保存范围(2)

    1.session <%@ page language="java" contentType="text/html" pageEncoding=" ...

  5. Optimal Subsequences(主席树)

    题意: 给定一个序列,长度为n(<=2e5),有m(<=2e5)个询问,每个询问包含k和pos,要从原序列中选出一个长度为k的子序列,要求是这个序列的和是所有长度为k的序列中最大的,且是字 ...

  6. [6期]Webshell提权服务器登录

    这一期内容较少,分享一点资料给大家吧:https://www.bilibili.com/video/av27708518/?spm_id_from=333.788.b_636f6d6d656e74.9 ...

  7. 协程分析之context上下文切换

    协程现在已经不是个新东西了,很多语言都提供了原生支持,也有很多开源的库也提供了协程支持. 最近为了要给tbox增加协程,特地研究了下各大开源协程库的实现,例如:libtask, libmill, bo ...

  8. Self-Attention 和 Transformer

    1.Self-Attention 之前的RNN输入是难以并行化的,我们下一个输入可能依赖前一个输出,只有知道了前面的输出才能计算后面的输出. 于是提出了 self-attention ,但是这时候 $ ...

  9. 《JAVA设计模式》之代理模式(Proxy)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述代理(Proxy)模式的: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式的结 ...

  10. Windows下Navicat远程连接Linux下MySQL服务器错误1130

    今天用Navicat在Windows下连接Linux服务器上的MySQL,显示出错误1130. 当然这是在修改了MySQL的配置文件my.cnf的前提下允许远程访问的基础上的,如果没有修改my.cnf ...