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 的安装
随机推荐
- 【转】详解springboot-修改内置tomcat版本
1.解析Spring Boot父级依赖 <parent> <groupId>org.springframework.boot</groupId> <artif ...
- 实验六:通过grub程序引导本地磁盘内核启动系统(busybox)
实验名称: 通过grub程序引导本地磁盘内核启动系统(busybox) 实验环境: 理论上,该实验只需要配置好xen环境即可,但是,我们的xen环境安装在centOS7上,但是我们又是使用的kerne ...
- JQuery 获取select 的value值和文本值
<select name="month" id="selMonth"> <option value="1">一 ...
- Pyspark 使用 Spark Udf 的一些经验
起初开始写一些 udf 的时候感觉有一些奇怪,在 spark 的计算中,一般通过转换(Transformation) 在不触发计算(Action) 的情况下就行一些预处理.udf 就是这样一个好用的东 ...
- Java多线程9:中断机制
一.概述 之前讲解Thread类中方法的时候,interrupt().interrupted().isInterrupted()三个方法没有讲得很清楚,只是提了一下.现在把这三个方法同一放到这里来讲, ...
- MySQL之InnoDB数据页结构(转自掘金小册 MySQL是怎样运行的,版权归作者所有!)
InnoDB为了不同的目的而设计了不同类型的页,我们把用于存放记录的页叫做数据页. 一个数据页可以被大致划分为7个部分,分别是 File Header,表示页的一些通用信息,占固定的38字节. Pag ...
- python doc格式转文本格式
首先python是不能直接读写doc格式的文件的,这是python先天的缺陷.但是可以利用python-docx (0.8.6)库可以读取.docx文件或.txt文件,且一路畅通无阻. 这样的话,可以 ...
- CF993D Compute Power(二分+Dp)
一看到这种求\(min/max\left \{ \frac{\sum a_i}{\sum b_i} \right \}\)的题肯定是\(01\)分数规划,大概可以算作一种二分? 设\(ans\)为当前 ...
- CentOS7使用firewalld防火墙配置端口
安装启用firewalld防火墙 CentOS7默认的防火墙是firewalld 如果没有firewalld防火墙,可以执行yum install firewalld 命令进行安装 firewalld ...
- iOS开发者知识普及,Swift 挑战 Objective-C,谁会笑到最后?
前言: 目前全球共有超过 7 亿台 iPhone 处于活跃状态,全球约有2000万名 iOS 开发者,这造就了 iOS 作为全球第二大移动设备平台的状态. 虽然安卓系统的全球市场占有率超过 iOS 系 ...