UVa10779 - Collectors Problem(最大流)
题目链接
简介:交换贴纸
分析:
这也算是一个天坑了
很久之前就看过这道题,但是一直没有填
美妙的建图:
我们用n-1个点表示每个除Bob之外的人
用m个点表示贴纸,从源点向这m个点连边,边的容量是Bob拥有该种贴纸的数量
接下来我们要连接其他人和贴纸:
如果第i个人有超过一张j种贴纸(有k张),那么我们就连接i—>j,容量为k-1,表示ta可以贡献出k-1张第j种贴纸
如果第i个人没有第j种贴纸,那么我们连接j—>i,容量为1,表示ta最多接受一张j贴纸
最后所有的贴纸连向汇点,流量为1
最大流即为最后答案
附样例图:
//这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>using namespace std;const int N=101;
const int INF=0x33333333;
struct node{int x,y,v,nxt;
};
node way[N*N];
int st[N],tot,deep[N],cur[N],s,t;
int n,m,zl[30][30];void add(int u,int w,int z)
{tot++;way[tot].x=u;way[tot].y=w;way[tot].v=z;way[tot].nxt=st[u];st[u]=tot;tot++;way[tot].x=w;way[tot].y=u;way[tot].v=0;way[tot].nxt=st[w];st[w]=tot;
}int bfs(int s,int t)
{for (int i=s;i<=t;i++) cur[i]=st[i];memset(deep,-1,sizeof(deep));queue<int> Q;Q.push(s);deep[s]=1;while (!Q.empty()){int now=Q.front(); Q.pop();for (int i=st[now];i!=-1;i=way[i].nxt)if (way[i].v&&deep[way[i].y]==-1){deep[way[i].y]=deep[now]+1;Q.push(way[i].y);}}return deep[t]!=-1;
}int dfs(int now,int t,int limit)
{if (now==t||!limit) return limit;int f,flow=0;for (int i=cur[now];i!=-1;i=way[i].nxt){cur[now]=i;if (way[i].v&&deep[way[i].y]==deep[now]+1&&(f=dfs(way[i].y,t,min(limit,way[i].v)))){flow+=f;limit-=f;way[i].v-=f;way[i^1].v+=f;if (!limit) break;}}return flow;
}int dinic()
{int ans=0;while (bfs(s,t))ans+=dfs(s,t,INF);return ans;
}int main()
{int T;scanf("%d",&T);for (int cas=1;cas<=T;cas++){memset(st,-1,sizeof(st));tot=-1;scanf("%d%d",&n,&m);memset(zl,0,sizeof(zl));for (int i=1;i<=n;i++){ int k,x; //inputscanf("%d",&k);for (int l=1;l<=k;l++)scanf("%d",&x),zl[i][x]++;}s=0; t=n+m+1;for (int i=1;i<=m;i++){if (zl[1][i]) add(s,i,zl[1][i]);add(i,t,1);} for (int i=2;i<=n;i++)for (int j=1;j<=m;j++){if (zl[i][j]>1) //可以给出一张j add(i+m,j,zl[i][j]-1);if (!zl[i][j]) //没有j,最多可以接受一张j add(j,i+m,1);}printf("Case #%d: %d\n",cas,dinic());} return 0;
}
转载于:https://www.cnblogs.com/wutongtong3117/p/7673029.html
UVa10779 - Collectors Problem(最大流)相关推荐
- HDU 3549 Flow Problem(最大流模版EK算法)
题目链接 第一道最大流,赤裸裸的模版题,刚好可以熟悉模版用.今天看了一下最大流,就看了一个EK算法,感觉有点和二分图匹配算法有点相似,对于最大流问题有点了解了,不过为什么这么做,也不是 很懂,只是把代 ...
- [hdu3549]Flow Problem(最大流模板题)
解题关键:使用的挑战程序设计竞赛上的模板,第一道网络流题目,效率比较低,且用不习惯的vector来建图. 看到网上其他人说此题有重边,需要注意下,此问题只在邻接矩阵建图时会出问题,邻接表不会存在的,也 ...
- UVA - 10779 Collectors Problem
经典的根据题目描述yy连边的网络流hhhh,几乎可以说是模拟了 #include<bits/stdc++.h> #define ll long long #define pb push_b ...
- 2018十二月刷题列表
Preface \(2018\)年的尾巴,不禁感慨自己这一年的蜕变只能用蜕变来形容了. 而且老叶说我们今年没的参加清北冬令营可以参加CCF在广州二中举办的冬令营,只要联赛\(390+\)就应该可以报. ...
- java 流计算_Java 流收集器 ( Stream Collectors ) ( 一 ) - 统计计算
首先需要声明的是,我的开发语言是 PHP,但我对所有语言都懂一点点,然后很多文章,都是看到某个知识点就想写些什么 刚刚再浏览某些文章的时候看到 Java 的流收集器 ( Stream Collecto ...
- javaSE8的流库总结
前言 本篇博客对 java 8 的流库进行一个总结 1. 从迭代到流 在处理集合时,我们通常会迭代遍历它的元素,并在每个元素上执行某项操作,列如假设我们想统计某本书的所有长单词数(单词长度大于10): ...
- Java8中的流操作-基本使用性能测试
一.流(Stream)简介 流是 Java8 中 API 的新成员,它允许你以声明式的方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现).这有点儿像是我们操作数据库一样,例如我想要查询出热 ...
- Java 8 中的流操作-基本使用性能测试
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:一个线程池 bug 引发的 GC 思考! 一.流(Stream)简介 流是 Java8 中 API 的新成员,它 ...
- 【java学习笔记】java se8的流库概念以及使用
概念 代码实例 流的创建 惰性求值与及早求值 概念 流提供了一种让我们可以在比集合更高的概念级别上指定计算的数据视图.通过使用流,我们可以说明想要完成什么任务,而不是说明如何去实现它.我们将操作的调度 ...
最新文章
- Tair的桶分布策略介绍及新的机器级位置安全优先策略实现
- SAP Spartacus默认的baseSite是从源代码什么地方读取的
- Linux命令工作中常用的总结
- JVM——Java内存区域相关3
- 神仙在双11晚上,都干了些啥?
- 2015 03 03 复习 上课笔记(一)
- bmp制作自定义字体(cocostudio使用)
- MyBatis foreach语句批量插入数据
- 面向对象3:类和对象
- 信息学奥赛NOIP/CSP-J初赛知识点汇总
- 零基础CSS入门教程(29)–CSS下拉菜单实例
- 结构光三维重建阶段性总结
- 领存技术至强 E5-2648L 6U VPX 通用密集计算刀片
- ping ip和端口
- 【营销获客二】如何用企业微信搭建私域流量营销平台
- 09年第33周,时尚数码3c超人加潮人10大酷品装备推荐(上)
- 深度学习论文精读(4):MobileNetV2
- HTML5 移动应用开发的生态环境简介
- h5网页检测手机是否安装了app。
- tomcat从零开始配置https
热门文章
- future java 多线程_Java多线程之Future与FutureTask
- ftp限流java,FTP流量限制的方法
- python的循环语句机制_Python-for循环的内部机制
- td 内单选框不可用_在TD,我和曾经的老师变成了同事,也收获了最满意的“课外活动”...
- python 追加到字典_使用Python读取,写入和解析JSON
- C语言 | 链表概述
- 函数指针,指针函数,函数指针数组
- ar面部识别_国内手机厂商AR布局报告
- dataframe 选择输出_使用 Python 实现机器学习特征选择的 4 种方法
- js 点击侧边栏展示内容_上海SEO优化网站侧边栏一般添加什么内容