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 的安装
随机推荐
- UIImagePickerController - 官方文档说明
使用UIImagePickerController对象的步骤: 1)验证设备是否能从目标源获取内容,通过调用 + (BOOL)isSourceTypeAvailable:(UIImagePickerC ...
- 【原创】架构师必备,带你弄清混乱的JAVA日志体系!
引言 还在为弄不清commons-logging-xx.jar.log4j-xx.jar.sl4j-api-xx.jar等日志框架之间复杂的关系而感到烦恼吗? 还在为如何统一系统的日志输出而感到不知所 ...
- 《构建之法》课程进度之Github、Travis等工具融入篇
<构建之法>里有一个16周的软件工程课程进度设计.本文在该基本设计的基础上,围绕github.com(源码管理).travis-ci.org(持续集成).单元测试工具.日志工具.少数实用U ...
- Linux slave配置
说明:master机器为Windows,现将一台Linux机器作为slave进行配置.这台Linux机器为CentOS. 1.在Linux slave上的配置 ①创建名为jenkins用户 #sudo ...
- CRM专业术语
客户关系管理(管理学词汇CRM)_百度百科https://baike.baidu.com/item/%E5%AE%A2%E6%88%B7%E5%85%B3%E7%B3%BB%E7%AE%A1%E7%9 ...
- lombok的简单使用小结
1.idea安装lombok插件 关于lombok如何在idea中使用,下面这篇博客写的很到位,并且提供了本地安装对应idea版本的lombok插件的地址.如果无法通过idea直接安装lombok,可 ...
- 一、rollup
参考:reduxreach-routerrollup-starter-librollup-starter-approller-clicreate-react-library 一.安装 npm inst ...
- 怼天怼地怼空气的Linus喜欢怎样的工作方式?
Linus Torvalds的“暴脾气”是出了名的,看到令自己不爽的事情就会怼过去,比如: 他曾经说Intel提交的漏洞修复程序是彻底的垃圾! 当别人说Git没用C++开发的时候, 他反击说“C++是 ...
- Python3 与 C# 并发编程之~ 协程篇
3.协程篇¶ 去年微信公众号就陆陆续续发布了,我一直以为博客也汇总同步了,这几天有朋友说一直没找到,遂发现,的确是漏了,所以补上一篇 在线预览:https://github.lesschina.c ...
- 越光后端开发——ygapi(1.新建项目ygapi、新建MySQL数据库yg、项目连接数据库)
1.新建MySQL数据库 show databases;//查看已经有的数据库 create database yg; 2.新建项目ygapi 1.使用pycharm新建django项目取名ygapi ...