AC的故事大结局山寨版(下)
AC的故事大结局山寨版(下)
小A算出幕后黑手的人员是如此之多,知道在我们华夏,手段通天者必然身居高位,仅仅靠他们的力量恐怕难以和他们对抗。
于是小A和小C找到了以前认识的检察官侯亮平,告诉侯亮平事情的始末后,他们立马通知赵东来安排了人手准备逮捕嫌疑人祁同伟(这么大的事居然没有事先向上级汇报就擅自行动)。
现在警厅里只有P<=100个警察,F<=100辆警车和C<=100把武器,每辆车和每把武器都有自己的特点,每个警察只会用其中的一些警车和武器。
每辆警车只坐一名警察(不知道为何要这么浪费资源,可能市局比较有钱),每位警察必须带上自己熟练的武器才能驾车出击。
为了打败幕后黑手祁同伟,小A合理安排后派出了最多的人手,相信你也一定知道派出了多少警察。最终成功逮捕了嫌疑人祁同伟。
从此小A和小C过上了幸福快乐的日子。可喜可贺,可喜可贺。
先输入一个整数t(<=100)表示有多少组数据
每组输入3个整数P,F,C,(3个数都不超过100)分别表示警察人数,警车数量和武器数量。
接着第i行表示第i个警察的能力(共P行)。该行先输入两个整数x,y表示该警察会驾驶x辆汽车和y把武器,之后有x个整数表示警车的编号和y个整数表示武器的编号。
(警车编号:1~F,武器编号:1~C)
每组输出一个整数,代表能带上武器驾车出击的警察最多有多少个
1
4 3 3
2 2 1 2 3 1
2 2 2 3 1 2
2 2 1 3 1 2
2 1 1 3 3
3 这题的话有坑点,刚开始写的时候,是直接如下建图的
这样建图就会出现一种情况,一个人会被重复使用,
所以这时候就应该这一个点分成两个点,用流量为1的边连接,如果这个人使用了,流量减为0,这样就不会被重复使用
然后其他的就是标准的最小费用最大流解法了,用一个源点连接所有起始点,用一个汇点连接所有结束点,流量cap=1,cost=0,
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
struct Dinic
{
static const int MAXN = + ; ///改网络流的点
static const int MAXM = MAXN * MAXN; ///改网络流的边
static const int INF = 0x3f3f3f3f; ///看情况改 int n, m, s, t;
int first[MAXN], cur[MAXN], dist[MAXN], sign; struct Node
{
int to, flow, next;
} edge[MAXM * ]; inline void init(int start, int vertex, int ss, int tt)
{
n = vertex, s = ss, t = tt;
for(int i = start; i <= n; i++ )
{
first[i] = -;
}
sign = ;
}
inline void add_edge(int u, int v, int flow)
{
edge[sign].to = v, edge[sign].flow = flow, edge[sign].next = first[u];
first[u] = sign++;
edge[sign].to = u, edge[sign].flow = , edge[sign].next = first[v];
first[v] = sign++;
} inline int dinic()
{
int max_flow = ;
while(bfs(s, t))
{
for(int i = ; i <= n; i++ )
{
cur[i] = first[i];
}
max_flow += dfs(s, INF);
}
return max_flow;
}
bool bfs(int s, int t)
{
memset(dist, -, sizeof(dist));
queue<int>que;
que.push(s), dist[s] = ;
while(!que.empty())
{
int now = que.front();
que.pop();
if(now == t)
{
return ;
}
for(int i = first[now]; ~i; i = edge[i].next)
{
int to = edge[i].to, flow = edge[i].flow;
if(dist[to] == - && flow > )
{
dist[to] = dist[now] + ;
que.push(to);
}
}
}
return ;
}
int dfs(int now, int max_flow)
{
if(now == t)
{
return max_flow;
}
int ans = , next_flow = ;
for(int &i = cur[now]; ~i; i = edge[i].next)
{
int to = edge[i].to, flow = edge[i].flow;
if(dist[to] == dist[now] + && flow > )
{
next_flow = dfs(to, min(max_flow - ans, flow));
ans += next_flow;
edge[i].flow -= next_flow;
edge[i ^ ].flow += next_flow;
if(ans == max_flow)
{
return max_flow;
}
}
}
if(ans == )
{
return dist[now] = ;
}
return ans;
} } dinic; /**
.init(点编号起点, 点编号终点, 源点, 汇点)
.add_edge(u, v, w) 加边
.dinic() 输出最大流
*/ int a[],b[];
int main()
{
int t,p,f,c;
scanf("%d",&t);
while(t--)
{
int s=,t=;
dinic.init(s,t,s,t); scanf("%d%d%d",&p,&f,&c);
for(int i=; i<=f; i++) ///s->车
dinic.add_edge(s,i,);
for(int i=;i<=p;i++)
dinic.add_edge(i+,i+,);
for(int i=; i<=c; i++)
dinic.add_edge(i+,t,); ///枪->t
for(int i=; i<=p; i++)
{
int x,y;
scanf("%d%d",&x,&y);
for(int j=; j<=x; j++) ///车
{
int z;
scanf("%d",&z);
dinic.add_edge(z,i+,);
}
for(int j=; j<=y; j++)
{
int z;
scanf("%d",&z);
dinic.add_edge(i+,z+,);
}
}
printf("%d\n",dinic.dinic());
}
return ;
}
AC的故事大结局山寨版(下)的更多相关文章
- AC的故事大结局山寨版(下)(最大流)
福建工程学院第十二届ACM程序设计大赛真题 AC的故事大结局山寨版(下) TimeLimit:2000MS MemoryLimit:128MB 64-bit integer IO format:%l ...
- AFO 我的oi生涯 大结局
今儿个哥几个一屋子退役了,这两天也许会写一个生涯大结局留作纪念吧. 今天就写了吧. 由于在机房的原因比一般同学获得的知识更多一些.进来总是看新闻,感慨颇多.自从两会开的第一天起,我就对我们政府采取的一 ...
- Java匹马行天下之Java帝国的崛起(大结局)
Java匹马行天下之Java帝国的崛起大结局 前言: [博客*缘] 网络真情伴, 博客友谊连. 笑中藏泪暖中寒. 回想那些悲喜, 苦涩也缠绵. 往事难回首, 新篇染旧言. 世间多少梦能全. 感谢相牵, ...
- Windows Phone开发(45):推送通知大结局——Raw通知
原文:Windows Phone开发(45):推送通知大结局--Raw通知 为什么叫大结局呢?因为推送通知服务就只有三种,前面扯了两种,就剩下一种--Raw通知. 前面我们通过两节的动手实验,相信大家 ...
- 实力封装:Unity打包AssetBundle(大结局)
→→前情提要:让用户选择要打包的文件←← 大结局:更多选择 Unity打包AssetBundle从入门到放弃系列终于要迎来大结局了[小哥哥表示实在写不动了o(╥﹏╥)o]... 经过上一次的教程,其实 ...
- 大白话系列之C#委托与事件讲解大结局
声明:本系列非原创,因为太精彩才转载,如有侵权请通知删除,原文:http://www.cnblogs.com/wudiwushen/archive/2010/04/20/1698795.html 今天 ...
- 11种常用css样式学习大结局滚动条与显示隐藏
滚动条展示 overflow-x: hidden;/*是否对内容的左/右边缘进行裁剪*/overflow-y: hidden;/*是否对内容的上/下边缘进行裁剪*/overflow:scroll;/* ...
- 《.NET 5.0 背锅案》第7集-大结局:捉拿真凶 StackExchange.Redis.Extensions 归案
第1集:验证 .NET 5.0 正式版 docker 镜像问题 第2集:码中的小窟窿,背后的大坑,发现重要嫌犯 EnyimMemcachedCore 第3集-剧情反转:EnyimMemcachedCo ...
- R You Ready?——大数据时代下优雅、卓越的统计分析及绘图环境
作者按:本文根据去年11月份CSDN举办的“大数据技术大会”演讲材料整理,最初发表于2012年2月期<程序员>杂志. 0 R 的安装
随机推荐
- Mysql_安装
安装环境:win7 1.下载zip安装包: MySQL8.0 For Windows zip包下载地址:https://dev.mysql.com/downloads/file/?id=476233, ...
- 第四章· Redis的事务、锁及管理命令
一.事务介绍 二.Redis乐观锁介绍 三.Redis管理命令 一.事务介绍 Redis的事务与关系型数据库中的事务区别 1)在MySQL中讲过的事务,具有A.C.I.D四个特性 Atomic(原子性 ...
- 【php】记录一次生产环境bug的调试
参考链接: [php调试利器 -- xdebug]https://www.cnblogs.com/anyeshe/p/5746404.html [PHP 后端调试输出方法(笨办法)]https://b ...
- Error updating database. Cause: java.sql.SQLException: Access denied for user '${username}'@'localhost' (using password: YES)
导入别人的项目,出现一个错误,经过排查,是db.properties配置文件中的用户名与Mybatis-conf.xml配置文件中调用的用户名不一致所导致的 (db.properties中用的是nam ...
- 其它综合-有趣的linux命令行工具-lolcat
lolcat :一个在 Linux 终端中输出彩虹特效的命令行工具 何为Lolcat Lolcat 是一个针对 Linux,BSD 和 OSX 平台的工具,它类似于 cat,并为 cat 的输出添加彩 ...
- 使用ffmpeg视频切片并加密
想达到的目的:将一个mp4视频文件切割为多个ts片段,并在切割过程中对每一个片段使用 AES-128 加密,最后生成一个m3u8的视频索引文件: 电脑环境 Fedora,已经安装了最新的ffmpeg: ...
- windows下使用hbase/opencv/ffmpeg小记
1.hadoop安装 不同于Ubuntu,win 10下使用hbase需安装hadoop环境,这里有几个坑,首先14年以后,hadoop已不再发布window版本,这里可往官网 http://hado ...
- [python]python3.7中文手册
https://pythoncaff.com/docs/tutorial/3.7.0
- WS_TABSTOP 与 BS_DEFPUSHBUTTON 第一次使有
关于 WS_TABSTOP,我一直没搞明白,为何加了 WS_TABSTOP ,当按下 Tab 键时,窗口中的控件还是不能自动的切换焦点. 为何 SetFocus(hwnd); 后,虽然按钮已获得焦点, ...
- EF CodeFirst系列(2)---CodeFirst的数据库初始化
1. CodeFirst的默认约定 1.领域类和数据库架构的映射约定 在介绍数据库的初始化之前我们需要先了解领域类和数据库之间映射的一些约定.在CodeFirst模式中,约定指的是根据领域类(如Stu ...