https://vjudge.net/problem/UVA-10779#author=0

网络流

1.Bob向他有的贴纸连边,流量为他有的贴纸数量

2.每一种贴纸向汇点连流量为1的边

3.其余人,如果没贴纸i,由i向这个人连一条流量为1的边

4.如果贴纸i数量>1,由这个人向i连一条流量为数量-1的边

#include <cstdio>
#include <algorithm>
#include <queue> using namespace std;
const int N = ;
const int M = ; #define gc getchar()
#define oo 999999999 int n, m, now, S, T, TI;
int head[N], now_head[N], calc[N], dis[N];
struct Node{
int u, v, flow, nxt;
}G[M];
queue <int> Q; inline int read(){
int x = ; char c = gc;
while(c < '' || c > '') c = gc;
while(c >= '' && c <= '') x = x * + c - '', c = gc;
return x;
} inline void add(int u, int v, int flow){
G[now].v = v; G[now].flow = flow; G[now].nxt = head[u]; head[u] = now ++;
} inline bool bfs(){
for(int i = S; i <= T; i ++) now_head[i] = head[i], dis[i] = -;
dis[S] = ;
while(!Q.empty()) Q.pop();
Q.push(S);
while(!Q.empty()){
int topp = Q.front();
Q.pop();
for(int i = head[topp]; ~ i; i = G[i].nxt){
int v = G[i].v;
if(dis[v] == - && G[i].flow > ){
dis[v] = dis[topp] + ;
if(v == T) return ;
Q.push(v);
}
}
}
return ;
} int dfs(int now, int flow){
if(now == T) return flow;
int ret = ;
for(int & i = now_head[now]; ~ i; i = G[i].nxt){
int v = G[i].v;
if(dis[v] == dis[now] + && G[i].flow > ){
int f = dfs(v, min(G[i].flow, flow - ret));
if(f) {G[i].flow -= f; G[i ^ ].flow += f; ret += f; if(ret == flow) break;}
}
}
if(ret != flow) dis[now] = -;
return ret;
} inline int Dinic(){
int ret = ;
while(bfs()) ret += dfs(S, oo);
return ret;
} int main()
{
TI = read();
for(int Ti = ; Ti <= TI; Ti ++){
n = read(); m = read(); now = ;
T = n + m + ; S = ;
for(int i = ; i <= T; i ++) head[i] = -;
for(int i = ; i <= m; i ++) add(n + i, T, ), add(T, n + i, );
int k = read();
for(int i = ; i <= k; i ++){int im = read(); calc[im] ++;}
for(int i = ; i <= m; i ++) if(calc[i]) add(, n + i, calc[i]), add(n + i, , );
for(int i = ; i <= m; i ++) calc[i] = ;
for(int i = ; i <= n; i ++){
int k = read();
for(int j = ; j <= k; j ++){int im = read(); calc[im] ++;}
for(int j = ; j <= m; j ++)
if(calc[j] > ) add(i, n + j, calc[j] - ), add(n + j, i, );
else if(!calc[j]) add(n + j, i, ), add(i, n + j, );
for(int j = ; j <= m; j ++) calc[j] = ;
}
int answer = Dinic();
printf("Case #%d: %d\n", Ti, answer);
} return ;
}
/*
2
2 5
6 1 1 1 1 1 1
3 1 2 2
3 5
4 1 2 1 1
3 2 2 2
5 1 3 4 4 3
*/

[Bob]Collectors Problem的更多相关文章

  1. 湘潭校赛 Bob's Problem

    Bob's Problem Accepted : 18   Submit : 115 Time Limit : 1000 MS   Memory Limit : 65536 KB  题目描述 Bob今 ...

  2. UVA10779 Collectors Problem

    题目链接:https://cn.vjudge.net/problem/UVA-10779 前言: 本题是关于姜志豪<网络流的一些建模方法>的笔记. 知识点: 最大流 题意摘抄: \(Bob ...

  3. UVa10779 Collectors Problem(最大流)

    很容易想到源点向所类型有贴纸连边,容量为Bob一开始有的数量:然后贴纸向汇点连边,容量为1. 接下来就是交换部分的连边了.注意交换一次一次进行,每次只能交换一张. 交换,是对于两种贴纸而言,仅会发生在 ...

  4. UVA 10779 Collectors Problem(最大流)

    这个题是很难往网络流上面构思的... 从s向每个物品增加容量为Bob拥有数的弧,然后从每个物品向t增加容量为1的弧(代表种类个数).这时候跑最大流的话,得到的肯定是Bob拥有的初始种类数.那么交换后的 ...

  5. UVA-10779 Collectors Problem (网络流建模)

    题目大意:有n个人,已知每人有ki个糖纸,并且知道每张糖纸的颜色.其中,Bob希望能和同伴交换使得手上的糖纸数尽量多.他的同伴只会用手上的重复的交换手上没有的,并且他的同伴们之间不会产生交换.求出Bo ...

  6. UVA-10779 Collectors Problem

    https://vjudge.net/problem/UVA-10779 题意:n个人,m种贴纸,每个人开始有一些贴纸 第一个人可以跟任何人交换任何贴纸 其余人只能用重复的贴纸 跟第一个人交换他们没有 ...

  7. AC日记——Collectors Problem uva 10779

    UVA - 10779 思路: 最大流: s向所有的贴纸的种类连边,流量为Bob拥有的数量: 然后,Bob的朋友如果没有这种贴纸,则这种贴纸向bob的朋友连边,容量1: 如果bob的朋友的贴纸很多大于 ...

  8. UVA10779 Collectors Problem 【迁移自洛谷博客】

    这是一道不错的练最大流建模的基础题. 这种题目审题是关键. Bob's friends will only exchange stickers with Bob, and they will give ...

  9. uva 10779 Collectors Problem 网络流

    链接 一共有n个人, m种收藏品, 每个人拥有的收藏品的种类和个数都是不相同的. 假设2-n这些人都只和1互相交换, 比例是1:1, 并且, 2-n这些人, 只换自己现在没有的, 如果他现在有第二种, ...

随机推荐

  1. ACM集训

    2019-07-18 09:06:10 emmm.... 昨天5个小时做了一道题,心情复杂,不着急慢慢来 Ivan recently bought a detective book. The book ...

  2. 2019牛客多校八 H. How Many Schemes (AC自动机,树链剖分)

    大意: 给定树, 每条边有一个字符集合, 给定$m$个模式串, $q$个询问$(u,v)$, 对于路径$(u,v)$中的所有边, 每条边从对应字符集合中取一个字符, 得到一个串$s$, 求$s$至少包 ...

  3. 音视频入门-07-认识YUV

    * 音视频入门文章目录 * YUV & YCbCr 简介 YUV,是一种颜色编码方法.常使用在各个视频处理组件中. YUV 在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽. Y ...

  4. Linux mount/unmount 挂载和卸载指令

    对于Linux用户来讲,不论有几个分区,分别分给哪一个目录使用,它总归就是一个根目录.一个独立且唯一的文件结构 Linux中每个分区都是用来组成整个文件系统的一部分,她在用一种叫做“挂载”的处理方法, ...

  5. Powershell学习笔记:(一)、初识Powershell

    什么是Powershell? MSDN上的说明是:PowerShell 是构建于 .NET 上基于任务的命令行 shell 和脚本语言. PowerShell 可帮助系统管理员和高级用户快速自动执行用 ...

  6. 2..net core 和.net framework 版本

    同一台机器上可以安装多个版本的.net core runtime.比如: 每个.net core项目都可以指定自己所用的版本,所以改变某个项目的target version不会影响到其他的.安装新的r ...

  7. 转 无损转换Image为Icon

    不可取 var handle = bmp.GetHicon();    //得到图标句柄return Icon.FromHandle(handle); //通过句柄得到图标 可取 /// <su ...

  8. 我自己用C++写了个GMM(Gaussian mixture model)模型

    我自己用C++写了个GMM(Gaussian mixture model)模型 Written for an assignment 之前粗粗了解了GMM的原理,但是没有细看,现在有个Assignmen ...

  9. SAP-参数(条件表)配置教程–GS01/GS02/GS03

    转载:http://www.baidusap.com/abap/others/2849 在SAP开发中,某段代码运行可能需要满足某个条件,通常解决办法有两种:一种是在代码中写死限制条件,此种方式当限制 ...

  10. K2 BPM_康熙别烦恼(上篇)——分级授权_工作流引擎