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. 【C#】课堂知识点#3

    1.讲解了实验1中,利用Char.is***来进行判断字符类型. using System; using System.Collections.Generic; using System.Linq; ...

  2. Arm-Linux 移植 alsa

    ref : https://www.cnblogs.com/yutingliuyl/p/6718875.html https://blog.csdn.net/yuanxinfei920/article ...

  3. NEST指定id

    1.默认以Id属性为Id,无Id属性则自动生成 2.可通过属性标签指定Id [ElasticsearchType(IdProperty = nameof(last_name))] public cla ...

  4. eigenface算法笔记

    昨天看了PCA(PCA算法介绍见上一篇),今天继续看eigenface,在这里把eigenface的过程梳理下: EigenFace本质上讲,是把人脸从像素空间变换到另一个空间,在另一个空间中做相似性 ...

  5. 写在NOIP2018后

    退役学了一周文化课,感觉还行吧 在周四就有学弟跟我说用我的源代码测329,当时还是出乎意料的. 本来期望是100+50+55+100+50+44=399,结果测得是100+55+50+100+20+4 ...

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

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

  7. 利用python爬取王者荣耀英雄皮肤图片

    前两天看到同学用python爬下来LOL的皮肤图片,感觉挺有趣的,我也想试试,于是决定来爬一爬王者荣耀的英雄和皮肤图片. 首先,我们找到王者的官网http://pvp.qq.com/web201605 ...

  8. Python:GeoJson格式的多边形裁剪Tiff影像并计算栅格数值

    JSON是通过键值对表示数据对象的一种格式,其全称为JavaScript Object Notation,它采用完全独立于编程语言的文本格式来存储和表示数据,轻量级.简洁清晰的层次结构.容易解析等特点 ...

  9. Pandas-高级部分及其实验

    有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/11014893.html jupyter代码原文 ...

  10. 铰链joints

    Fixed Joint原理像阶层里的父子结构.关节会将对象锁在一个世界坐标或者锁在一个连接的刚体. 固定关节可以设定断裂力道(Break Farce)和断裂扭力(Break torque),破坏关节所 ...