FZU - 2295 Human life:网络流-最大权闭合子图-二进制优化-第九届福建省大学生程序设计竞赛
(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦
http://acm.fzu.edu.cn/problem.php?pid=2295
http://acm.fzu.edu.cn/problem.php?pid=2295
Catalog
Problem:Portal传送门
原题目描述在最下面。
题意就是很裸的最大权闭合子图。
推荐阅读:胡伯涛《最小割模型在信息学竞赛中的应用》
完完全全的模板题:新疆大学五月月赛-D-勤奋的杨老师
本题题意:m(50)个任务,n个技能。完成每个任务由相应的收益,完成每个任务前必须学一些技能。有些技能由先修技能。
有些任务不能同时完成。
Solution:
训练赛的时候听队友讲完题意,一眼就直接建对图了,但是没敢敲,因为比赛刚开始,想先写签到题。
详细de题解啊啊啊
直接讲建图:源点S想每个任务连边,流量为其收益,每个任务向其需要的技能连边,每个任务向先修技能连边,每个技能向汇点T连边,流量为其花费。答案是\(sum_{任务}-maxflow\).
难点在于有些任务不能同时完成。因为只有k(5)对,直接二进制枚举所有对互斥情况。为1则不能选第一个任务,为0则不能选第二个任务。不选就是取反再异或一下。
细节看代码吧。
AC_Code:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#define mme(a,b) memset((a),(b),sizeof((a)))
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int MXN = 2e2+7;
const int MXE = MXN*MXN;
struct DINIC{
int tot,vt,vs;
int d[MXN],head[MXN];
struct lp{
int v,w,nex;
}cw[MXE];
void add_edge(int a,int b,int c){
cw[++tot].v=b;cw[tot].nex=head[a],cw[tot].w=c;
head[a]=tot;
cw[++tot].v=a;cw[tot].nex=head[b],cw[tot].w=0;
head[b]=tot;
}
bool bfs(){
memset(d,-1,sizeof(d));
queue<int>Q;
Q.push(vt);d[vt]=0;
while(!Q.empty()){
int u=Q.front();
Q.pop();
for(int i=head[u];i!=-1;i=cw[i].nex){
int v=cw[i].v;
if(cw[i^1].w&&d[v]==-1){
d[v]=d[u]+1;
Q.push(v);
}
}
}
return d[vs]!=-1;
}
int dfs(int x,int f){
if(x==vt||f==0) return f;
int use=0,w;
for(int i=head[x];i!=-1;i=cw[i].nex){
int to=cw[i].v;
if(d[to]==d[x]-1 && cw[i].w){
w=dfs(to,min(cw[i].w,f-use));
cw[i].w-=w,cw[i^1].w+=w;
use+=w;
if(use==f) return f;
}
}
return use;
}
void init(int st,int ed){
tot = -1;
memset(head,-1,sizeof(head));
vs = st; vt = ed;
}
int max_flow(){
int ans=0;
while(bfs())ans+=dfs(vs,INF);
return ans;
}
}dinic;
const int N = 105;
int n, m, k;
int vs, vt;
struct lp{
int v,x;
int a[N];
}ar[N],br[N];
int c[N],d[N];
int main(){
int tim;
scanf("%d", &tim);
while(tim--){
scanf("%d%d%d", &n, &m, &k);
vs = 0;vt = m+n+1;
for(int i = 1; i <= n; ++i){
int v,x;
scanf("%d%d", &v, &x);
ar[i].v=v;ar[i].x=x;
for(int j = 0; j < x; ++j){
scanf("%d", &ar[i].a[j]);
}
}
for(int i = 1; i <= m; ++i){
int v,x;
scanf("%d%d", &v, &x);
br[i].v=v;br[i].x=x;
for(int j = 0; j < x; ++j){
scanf("%d", &br[i].a[j]);
}
}
for(int i = 0; i < k; ++i){
scanf("%d%d", &c[i], &d[i]);
--c[i];--d[i];
}
int sta = 1 << k, ans = 0;
//printf("%lld\n", 1<<50);
for(int t = 0; t < sta; ++t){
LL hhh = (1LL<<m)-1;
for(int i = 0; i < k; ++i){
LL x = 1LL<<c[i], y = 1LL<<d[i];
if(t&(1<<i)){
hhh &= (~x);
}else{
hhh &= (~y);
}
}
//printf("hhh = %d\n", hhh);
dinic.init(vs, vt);
for(int i = 1, v; i <= n; ++i){
dinic.add_edge(i+m,vt,ar[i].v);
for(int j = 0; j < ar[i].x; ++j){
v = ar[i].a[j];
dinic.add_edge(i+m,v+m,INF);
}
}
int sum = 0, tmp;
for(int i = 1, v; i <= m; ++i){
if((hhh&(1LL<<(i-1)))==0)continue;
dinic.add_edge(vs,i,br[i].v);
sum += br[i].v;
for(int j = 0; j < br[i].x; ++j){
v = br[i].a[j];
dinic.add_edge(i,v+m,INF);
}
}
tmp = dinic.max_flow();
ans = max(ans, sum - tmp);
}
printf("%d\n", ans);
}
return 0;
}
####Problem Description:
![这里写图片描述](https://img-blog.csdn.net/20180826195739905)
FZU - 2295 Human life:网络流-最大权闭合子图-二进制优化-第九届福建省大学生程序设计竞赛的更多相关文章
- FZU - 2295 Human life (最大权闭合子图)
题目链接 FZU - 2295 Human life 题目分析 题意:你在玩一个游戏,在其中你可以通过学习一些技能,但是学习某些技能之前,可能还要学习一些其他的技能,并且学习任何技能都有一定的花费: ...
- fzu 2105 Digits Count ( 线段树 ) from 第三届福建省大学生程序设计竞赛
http://acm.fzu.edu.cn/problem.php?pid=2105 Problem Description Given N integers A={A[0],A[1],...,A[N ...
- BZOJ 4873 [Shoi2017]寿司餐厅 | 网络流 最大权闭合子图
链接 BZOJ 4873 题解 当年的省选题--还记得蒟蒻的我Day1 20分滚粗-- 这道题是个最大权闭合子图的套路题.严重怀疑出题人就是先画好了图然后照着图编了个3000字的题面.和我喜欢的妹子当 ...
- 【BZOJ1565】【NOI2009】植物大战僵尸 网络流 最大权闭合子图
题目大意 给你一个\(n\times m\)的地图,每个格子上都有一颗植物,有的植物能保护其他植物.僵尸从右往左进攻,每吃掉一颗植物就可以得到\(a_{i,j}\)的收益(\(a_{i,j}\)可 ...
- HihoCoder 1398 网络流 - 最大权闭合子图
周末,小Hi和小Ho所在的班级决定举行一些班级建设活动. 根据周内的调查结果,小Hi和小Ho一共列出了N项不同的活动(编号1..N),第i项活动能够产生a[i]的活跃值. 班级一共有M名学生(编号1. ...
- hihoCoder 1389 Sewage Treatment 【二分+网络流+优化】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛)
#1389 : Sewage Treatment 时间限制:2000ms 单点时限:2000ms 内存限制:256MB 描述 After years of suffering, people coul ...
- Human life FZU - 2295 最大权闭合子图(第一次遇到被教育了)
Xzz is playing a MMORPG "human life". In this game, there are N different skills. Some ski ...
- hihocoder1398 网络流五之最大权闭合子图
最大权闭合子图 虽然我自己现在总结不好最大权闭合子图.但也算稍稍理解辣. 网络流起步ing~~~(- ̄▽ ̄)- #include<iostream> #include<cstdio& ...
- Cogs 727. [网络流24题] 太空飞行计划(最大权闭合子图)
[网络流24题] 太空飞行计划 ★★☆ 输入文件:shuttle.in 输出文件:shuttle.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] W 教授正在为国家航天中心计 ...
随机推荐
- 编辑bbs文章 获取前端标题内容 和前端内容的方法
- BZOJ 3328: PYXFIB 解题报告
BZOJ 3328: PYXFIB 题意 给定\(n,p,k(1\le n\le 10^{18},1\le k\le 20000,1\le p\le 10^9,p \ is \ prime,k|(p- ...
- 使用VS2015制作安装包( 含相关的下载链接)
补充: 在看下面的教程过程中,如果在下面的步聚1中没有 " Visual Studio Installer", 则需要通过下面的链接进行安装 Visual Studio Insta ...
- Git 学习第四天
我们已经知道,通过命令 git remote add origin git@github.com/Your.name/file.git 可以连接远程仓库,那么,假如我现在想切换另个一远程仓库的连接应该 ...
- Java缓冲区读写
缓冲区读 有两种方法从缓冲区读取数据: 绝对位置 相对位置 使用四个版本重载的get()方法用于从缓冲区读取数据. get(int index)返回给定索引处的数据. get()从缓冲区中的当前位置返 ...
- 2019秋第一次Java学习总结
本周Java学习总结: 知识点总结: 1.Java中程序的执行步骤 使用Javac将一个.Java源文件编译成.class文件 使用Java可以执行一个*.class文件 2.&&与& ...
- Navicat for MySQL使用手记
摘要 在管理MySQL数据库的图形化工具中,最为熟知的就是phpMyAdmin和Mysql-Front了,今天跟大家分享另外一个管理mysql数据库的另外一个利器---Navicat MySQL. N ...
- 6个步骤,全方位掌握 Kafka
毋庸置疑,目前 Apache Kafka 是整个消息引擎领域的执牛耳者,也是大数据生态圈中颇为重量级的一员. 从最早诞生于 LinkedIn 的"分布式消息系统",到现在集成了分发 ...
- 这是<一起找打的约定>的改良版本
-- CREATE TABLE class ( -- cid INT(25)auto_increment PRIMARY KEY, -- caption VARCHAR(50) not NULL -- ...
- swagger2 注解说明 ( @ApiImplicitParams )
@Api:用在请求的类上,表示对类的说明 tags="说明该类的作用,可以在UI界面上看到的注解" value="该参数没什么意义,在UI界面上也看到,所以不需要配置&q ...