(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦



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:网络流-最大权闭合子图-二进制优化-第九届福建省大学生程序设计竞赛的更多相关文章

  1. FZU - 2295 Human life (最大权闭合子图)

    题目链接 FZU - 2295 Human life 题目分析 题意:你在玩一个游戏,在其中你可以通过学习一些技能,但是学习某些技能之前,可能还要学习一些其他的技能,并且学习任何技能都有一定的花费: ...

  2. 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 ...

  3. BZOJ 4873 [Shoi2017]寿司餐厅 | 网络流 最大权闭合子图

    链接 BZOJ 4873 题解 当年的省选题--还记得蒟蒻的我Day1 20分滚粗-- 这道题是个最大权闭合子图的套路题.严重怀疑出题人就是先画好了图然后照着图编了个3000字的题面.和我喜欢的妹子当 ...

  4. 【BZOJ1565】【NOI2009】植物大战僵尸 网络流 最大权闭合子图

    题目大意 ​ 给你一个\(n\times m\)的地图,每个格子上都有一颗植物,有的植物能保护其他植物.僵尸从右往左进攻,每吃掉一颗植物就可以得到\(a_{i,j}\)的收益(\(a_{i,j}\)可 ...

  5. HihoCoder 1398 网络流 - 最大权闭合子图

    周末,小Hi和小Ho所在的班级决定举行一些班级建设活动. 根据周内的调查结果,小Hi和小Ho一共列出了N项不同的活动(编号1..N),第i项活动能够产生a[i]的活跃值. 班级一共有M名学生(编号1. ...

  6. hihoCoder 1389 Sewage Treatment 【二分+网络流+优化】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛)

    #1389 : Sewage Treatment 时间限制:2000ms 单点时限:2000ms 内存限制:256MB 描述 After years of suffering, people coul ...

  7. Human life FZU - 2295 最大权闭合子图(第一次遇到被教育了)

    Xzz is playing a MMORPG "human life". In this game, there are N different skills. Some ski ...

  8. hihocoder1398 网络流五之最大权闭合子图

    最大权闭合子图 虽然我自己现在总结不好最大权闭合子图.但也算稍稍理解辣. 网络流起步ing~~~(- ̄▽ ̄)- #include<iostream> #include<cstdio& ...

  9. Cogs 727. [网络流24题] 太空飞行计划(最大权闭合子图)

    [网络流24题] 太空飞行计划 ★★☆ 输入文件:shuttle.in 输出文件:shuttle.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] W 教授正在为国家航天中心计 ...

随机推荐

  1. 行业顶级NoSQL成员坐阵,NoSQL数据库专场重点解析!

    NoSQL数据库作为数据库市场最重要的组成之一,它的一举一动都影响着成千上万的企业.本专场邀请了行业顶级的NoSQL核心成员与大家共同展望NoSQL数据库的未来,阿里巴巴.MongoDB.Rediss ...

  2. Http请求工具类 httputil

    package com.snowfigure.kits.net; import java.io.BufferedReader; import java.io.IOException; import j ...

  3. CSScomb.js --- 自定义 CSS 编写风格配置文件

    一.排序分类 1. content overflow position z-index display float ... 表示定位/布局的属性(content比较特殊,作为伪元素不可少的,经常放置于 ...

  4. 【书上讲解】最大m段子段和问题

    描述 [题解] 设f[i][j]表示前i个数字分成了j段的最大子段和. 则f[i][j] = max(f[i-1][j]+a[i] (第i个数字和第j段合在一起),f[k][j-1]+a[i] (第i ...

  5. (转)OS: 生产者消费者问题(多进程+共享内存+信号量)

    转:http://blog.csdn.net/yaozhiyi/article/details/7561759 一. 引子 时隔一年再次用到 cout 的时候,哥潸然泪下,这是一种久别重逢的感动,虽然 ...

  6. 1242 斐波那契数列的第N项

    1242 斐波那契数列的第N项  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题   斐波那契数列的定义如下:   F(0) = 0 F(1) = 1 F(n) = F( ...

  7. 1.5 React 与 DOM

    在这一节中,主要的讨论范围为 React 与 DOM 相关的处理,包括: 如何获取 DOM 元素 如何做事件响应处理 表单处理 style 属性 这节讲述过后,我们将会为 TODO 应用添加完整的事件 ...

  8. XML 扩展部分

    引入命名空间 xmlns DTD缺点 1.不支持命名空间 2.支持的数据类型很少 3.DTD不可扩展 4.DTD不遵循XML规范 DTD的优点 简洁 schema 通过schema来解决DTD的不足 ...

  9. 18、Page Object 设计模式

    Page Object 设计模式的优点如下: 减少代码的重复. 提高测试用例的可读性. 提高测试用例的可维护性, 特别是针对 UI 频繁变化的项目. 当你针对网页编写测试时,你需要引用该网页中的元素, ...

  10. jsp2自定义标签开篇

    在JSP2中开发标签库需要以下几个步骤: 1.开发自定义标签处理类: 2.建立一个*.tld文件,每个*.tld文件对应一个标签库,每个标签库可包含多个标签: 3.在JSP文件中使用自定义标签. 第一 ...