刷题总结——支线剧情(bzoj3876费用流)
题目:
Input
Output
输出一行包含一个整数,表示JYY看完所有支线剧情所需要的最少时间。
Sample Input
2 2 1 3 2
2 4 3 5 4
2 5 5 6 6
0
0
0
Sample Output
HINT
JYY需要重新开始3次游戏,加上一开始的一次游戏,4次游戏的进程是
1->2->4,1->2->5,1->3->5和1->3->6。
题解:
这道题很NB····
表面看起来如果直接按题意建图的话,会是一道有下界费用流的题···md我不会···
但可以转成普通费用流的题····这里引用PoPoQQQ题解····%%%%%%
对于每一条边权为z的边x->y:
从S到y连一条费用为z,流量为1的边 代表这条边至少走一次
从x到y连一条费用为z,流量为INF的边 代表这条边除了至少走的一次之外还可以随便走
对于每个点x:
从x到T连一条费用为0,流量为x的出度的边
从x到1连一条费用为0,流量为INF的边,代替原图上的源和汇
不得不说想到这样建图实在是太巧妙了·····
代码:
- #include<iostream>
- #include<cstdio>
- #include<cstdlib>
- #include<cmath>
- #include<ctime>
- #include<cctype>
- #include<cstring>
- #include<string>
- #include<algorithm>
- #include<queue>
- using namespace std;
- const int inf=1e+;
- const int N=;
- const int M=;
- queue<int>que;
- int tot=,first[N],go[M],next[M],rest[M],cost[M];
- int chu[N],ans=,dis[N],src,des,n;
- bool insta[N],visit[N];
- int R()
- {
- char c;
- int f=;
- for(c=getchar();c<''||c>'';c=getchar());
- for(;c>=''&&c<='';c=getchar())
- f=(f<<)+(f<<)+c-'';
- return f;
- }
- inline void comb(int a,int b,int c,int d)
- {
- next[++tot]=first[a],first[a]=tot,go[tot]=b,rest[tot]=c,cost[tot]=d;
- next[++tot]=first[b],first[b]=tot,go[tot]=a,rest[tot]=,cost[tot]=-d;
- }
- inline bool SPFA()
- {
- for(int i=src;i<=des;i++) visit[i]=false,dis[i]=inf;
- que.push(src);
- dis[src]=;
- while(!que.empty())
- {
- int u=que.front();
- que.pop();
- insta[u]=false;
- for(int e=first[u];e;e=next[e])
- {
- int v=go[e];
- if((dis[v]>dis[u]+cost[e])&&rest[e])
- {
- dis[v]=dis[u]+cost[e];
- if(!insta[v])
- {
- que.push(v);
- insta[v]=true;
- }
- }
- }
- }
- return dis[des]!=inf;
- }
- inline int dinic(int u,int flow)
- {
- if(u==des)
- {
- ans+=flow*dis[des];
- return flow;
- }
- visit[u]=true;
- int res=,delta,v;
- for(int e=first[u];e;e=next[e])
- {
- if(dis[v=go[e]]==dis[u]+cost[e]&&!visit[v]&&rest[e])
- {
- delta=dinic(v,min(rest[e],flow-res));
- if(delta)
- {
- rest[e]-=delta;
- rest[e^]+=delta;
- res+=delta;
- if(res==flow) break;
- }
- }
- }
- return res;
- }
- inline void maxflow()
- {
- while(SPFA())
- dinic(src,inf);
- }
- int main()
- {
- //freopen("a.in","r",stdin);
- n=R();
- int t,a,b;
- src=,des=n+;
- for(int i=;i<=n;i++)
- {
- t=R();
- for(int j=;j<=t;j++)
- {
- a=R(),b=R();
- comb(src,a,,b);
- comb(i,a,inf,b);
- }
- chu[i]=t;
- }
- for(int i=;i<=n;i++)
- {
- comb(i,des,chu[i],);
- if(i!=)
- comb(i,,inf,);
- }
- maxflow();
- cout<<ans<<endl;
- return ;
- }
刷题总结——支线剧情(bzoj3876费用流)的更多相关文章
- 2018.10.15 loj#6010. 「网络流 24 题」数字梯形(费用流)
传送门 费用流经典题. 按照题目要求建边. 为了方便我将所有格子拆点,三种情况下容量分别为111,infinfinf,infinfinf,费用都为validi,jval_{id_{i,j}}valid ...
- 2018.10.15 loj#6013. 「网络流 24 题」负载平衡(费用流)
传送门 费用流sb题. 直接从sss向每个点连边,容量为现有物品量. 然后从ttt向每个点连边,容量为最后库存量. 由于两个点之间可以互相任意运送物品,因此相邻的直接连infinfinf的边就行了. ...
- 【Codevs1237&网络流24题餐巾计划】(费用流)
题意:一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同. 假设第 i 天需要 ri块餐巾(i=1,2,…,N).餐厅可以购买新的餐巾,每块餐巾的费用为 p 分: 或者把旧餐巾送到快洗部,洗一块需 ...
- BZOJ 3876 [AHOI/JSOI2014]支线剧情 (最小费用可行流)
题面:洛谷传送门 BZOJ传送门 题目大意:给你一张有向无环图,边有边权,让我们用任意条从1号点开始的路径覆盖这张图,需要保证覆盖完成后图内所有边都被覆盖至少一次,求覆盖路径总长度的最小值 最小费用可 ...
- CF 277E Binary Tree on Plane (拆点 + 费用流) (KM也可做)
题目大意: 平面上有n个点,两两不同.现在给出二叉树的定义,要求树边一定是从上指向下,即从y坐标大的点指向小的点,并且每个结点至多有两个儿子.现在让你求给出的这些点是否能构成一棵二叉树,如果能,使二叉 ...
- [NOI2012]美食节(费用流)
题目描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都 ...
- 线性规划费用流解法(Bzoj1061: [Noi2008]志愿者招募)
题面 传送门 Sol 线性规划费用流解法用与求解未知数为非负数的问题 这道题可以列出一堆形如 \(x[i]+x[j]+x[k]+...>=a[p]\) 的不等式 我们强行给每个式子减去一个东西, ...
- 【BZOJ2245】[SDOI2011]工作安排 拆边费用流
[BZOJ2245][SDOI2011]工作安排 Description 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被 ...
- BZOJ3876[Ahoi2014&Jsoi2014]支线剧情——有上下界的最小费用最大流
题目描述 [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往 都有很多的支线剧情,现在JYY想花费 ...
随机推荐
- [windows]命令行关机或重启电脑
1.关机:菜单--〉运行--〉输入:cmd--〉输入:shutdown -s -t 0 2.重启:菜单--〉运行--〉输入:cmd--〉输入:shutdown -r -t 0 (注:“-r”代表重启, ...
- Win10系统64位快速专业安装版 V2016年
win10系统64位快速专业安装版 V2016年2月 系统下载:http://www.xitongma.com/ Ghost Win10 64位正式装机专业版2016 微软向Windows用户推送了w ...
- “流”的思维—Workflowy
3.“流”的思维—Workflowy是我最喜欢的”流“的工具(WorkFlowy - Organize your brain.)我觉得,让发散性的思维更具实施性,必须分步操作,必须有先后,必须单线程. ...
- gitlab autuo devops
[参考文章] Chengzi_comm的专栏 use gitlab ci docker run gitlab-runner gitlab-runner register 1. 在虚拟机或服务器运行gi ...
- java设计模式基础 - 解决某一类问题最行之有效的方法,框架是大的设计模式.
一.单例模式(Singleton) 1.单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1>某 ...
- UVa-213-信息解码
这题的话,我们只要理解题意,应该就不算很难. 我们可以开一个二维数组,用来存放对应的编码字符,第一个下表是length,第二个下标是value,这样一来,我们在读入数据的时候就进行处理,然后想要使用的 ...
- MySql的基操勿六
2018/12/6 星期四 19:34:07 authot by dabaine 数据库注释; -- 这就是注释 /*.....*/ 这也是注释 创建库; create databse [if not ...
- (9)zabbix创建监控项item
1. 创建监控项 点击配置(configuration)->主机(Hosts)->在你要配置的主机一栏上点击Items->点击create item.具体看截图,各个参数我都已经标注 ...
- laravel如何利用数据库的形式发送通知
具体实现需要分几步: 1.修改驱动为database; 2.创建database的queue表 3.创建任务sendMessage 4.创建发送逻辑dispatch 5.启动队列 接下来我们进行实操: ...
- laravel中的scope作用域
laravel中在模板中处理(属于不属于)的数据(增删改查),引入了scope来处理 也就是在模板定义方法中,加上前缀scope laravel中要求在定义的方法scope后面跟的字母要大写 后面那我 ...