AC的故事大结局山寨版(下)(最大流)

福建工程学院第十二届ACM程序设计大赛真题

AC的故事大结局山寨版(下)

TimeLimit:2000MS  MemoryLimit:128MB

64-bit integer IO format:%lld

已解决 | 点击收藏

Problem Description

小A算出幕后黑手的人员是如此之多,知道在我们华夏,手段通天者必然身居高位,仅仅靠他们的力量恐怕难以和他们对抗。

于是小A和小C找到了以前认识的检察官侯亮平,告诉侯亮平事情的始末后,他们立马通知赵东来安排了人手准备逮捕嫌疑人祁同伟(这么大的事居然没有事先向上级汇报就擅自行动)。

现在警厅里只有P<=100个警察,F<=100辆警车和C<=100把武器,每辆车和每把武器都有自己的特点,每个警察只会用其中的一些警车和武器。

每辆警车只坐一名警察(不知道为何要这么浪费资源,可能市局比较有钱),每位警察必须带上自己熟练的武器才能驾车出击。

为了打败幕后黑手祁同伟,小A合理安排后派出了最多的人手,相信你也一定知道派出了多少警察。最终成功逮捕了嫌疑人祁同伟。

从此小A和小C过上了幸福快乐的日子。可喜可贺,可喜可贺。

Input

先输入一个整数t(<=100)表示有多少组数据

每组输入3个整数P,F,C,(3个数都不超过100)分别表示警察人数,警车数量和武器数量。

接着第i行表示第i个警察的能力(共P行)。该行先输入两个整数x,y表示该警察会驾驶x辆汽车和y把武器,之后有x个整数表示警车的编号和y个整数表示武器的编号。

(警车编号:1~F,武器编号:1~C)

Output

每组输出一个整数,代表能带上武器驾车出击的警察最多有多少个

SampleInput

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

SampleOutput

3

思路:警察,武器,车都看作点,虚拟出源点汇点。保证源点到汇点必须经过一个警察,一个武器,一辆车。另外,警察要拆成两个点,为了避免警察被使用多次。所有关系作为流为1的边

正确的图:

错误的图:

如果有一个人可以使用多个武器多辆车,那么该警察可能被使用多次。如下图,警察1就会贡献流量2。

  1 #include <bits/stdc++.h>
  2
  3 using namespace std;
  4 const int MAXN = 1001;
  5 const int MAXM = 1e4 + 7;
  6 const int INF  = 0x7fffffff;
  7 typedef long long LL;
  8
  9 int s, t, p, f, c;
 10
 11 struct Edge {
 12     int to, w, next;
 13 } edge[MAXM * 4];
 14
 15 int first[MAXN], cur[MAXN], sign, dist[MAXN];
 16
 17 inline void init() {
 18     for(int i = 0; i < MAXN; i ++ ) {
 19         first[i] = -1;
 20     }
 21     sign = 0;
 22 }
 23
 24 inline void add_edge(int u,int v,int w) {
 25     edge[sign].to = v, edge[sign].w = w;
 26     edge[sign].next = first[u], first[u] = sign++;
 27     edge[sign].to = u, edge[sign].w = 0;
 28     edge[sign].next = first[v], first[v] = sign++;
 29 }
 30
 31 bool bfs(int s,int t) {
 32     memset(dist, -1, sizeof(dist));
 33     queue<int>que;
 34     que.push(s), dist[s] = 0;
 35     while(!que.empty()) {
 36         int now = que.front();
 37         que.pop();
 38         if(now == t) {
 39             return 1;
 40         }
 41         for(int i = first[now]; ~i; i = edge[i].next) {
 42             int to = edge[i].to, ww = edge[i].w;
 43             if(dist[to] == -1 && ww > 0) {
 44                 dist[to] = dist[now] + 1;
 45                 que.push(to);
 46             }
 47         }
 48     }
 49     return 0;
 50 }
 51
 52 int dfs(int s, int t, int max_flow) {
 53     if(s == t) {
 54         return max_flow;
 55     }
 56     for(int &i = cur[s]; ~i; i = edge[i].next) {
 57         int to = edge[i].to, ww = edge[i].w;
 58         if(dist[to] == dist[s] + 1 && ww > 0) {
 59             int flow = dfs(to, t, min(max_flow, ww));
 60             if(flow > 0) {
 61                 edge[i].w -= flow;
 62                 edge[i ^ 1].w += flow;
 63                 return flow;
 64             }
 65         }
 66     }
 67     return 0;
 68 }
 69
 70 int dinic(int s, int t) {
 71     int ans = 0;
 72     while(bfs(s, t)) {
 73         for(int i = 0; i < MAXN; i ++ ) {
 74             cur[i] = first[i];
 75         }
 76         ans += dfs(s, t, INF);
 77     }
 78     return ans;
 79 }
 80
 81 template<class T>
 82 inline bool nextInt(T &n)
 83 {
 84     T x = 0, tmp = 1; char c = getchar();
 85     while((c < ‘0‘ || c > ‘9‘) && c != ‘-‘ && c != EOF) c = getchar();
 86     if(c == EOF) return false;
 87     if(c == ‘-‘) c = getchar(), tmp = -1;
 88     while(c >= ‘0‘ && c <= ‘9‘) x *= 10, x += (c - ‘0‘),c = getchar();
 89     n = x*tmp;
 90     return true;
 91 }
 92
 93 template<class T>
 94 inline void out(T n)
 95 {
 96     if(n < 0)
 97     {
 98         putchar(‘-‘);
 99         n = -n;
100     }
101     int len = 0,data[20];
102     while(n)
103     {
104         data[len++] = n%10;
105         n /= 10;
106     }
107     if(!len) data[len++] = 0;
108     while(len--) putchar(data[len]+48);
109 }
110
111 int main() {
112     int T;
113     nextInt(T);
114     while(T--) {
115         nextInt(p), nextInt(f), nextInt(c);
116         s = 0, t = 1000;
117         init();
118         for(int i = 1; i <= f; i++ ) { ///s->car
119             add_edge(s, i, 1);
120         }
121         for(int i = 1; i <= p; i++ ) { ///line
122             add_edge(i + 200, i + 400, 1);
123         }
124         for(int i = 1; i <= c; i++ ) { ///gun->t
125             add_edge(i + 600, t, 1);
126         }
127         for(int i = 1; i <= p; i++ ) {
128             int x, y, id;
129             nextInt(x), nextInt(y);
130             for(int j = 1; j <= x; j++ ) { ///car
131                 nextInt(id);
132                 add_edge(id, i + 200, 1);
133             }
134             for(int j = 1; j <= y; j++ ) { ///gun
135                 nextInt(id);
136                 add_edge(i + 400, id + 600, 1);
137             }
138         }
139         out(dinic(s, t)), putchar(‘\n‘);
140     }
141
142     return 0;
143 }

原文地址:https://www.cnblogs.com/Q1143316492/p/8977079.html

时间: 2024-11-10 05:50:10

AC的故事大结局山寨版(下)(最大流)的相关文章

AC的故事大结局山寨版(下)

AC的故事大结局山寨版(下) TimeLimit:2000MS  MemoryLimit:128MB 64-bit integer IO format:%lld Problem Description 小A算出幕后黑手的人员是如此之多,知道在我们华夏,手段通天者必然身居高位,仅仅靠他们的力量恐怕难以和他们对抗. 于是小A和小C找到了以前认识的检察官侯亮平,告诉侯亮平事情的始末后,他们立马通知赵东来安排了人手准备逮捕嫌疑人祁同伟(这么大的事居然没有事先向上级汇报就擅自行动). 现在警厅里只有P<=

C++ Primer 学习笔记_108(大结局!!!)_特殊工具与技术 --固有的不可移植的特征[下]

特殊工具与技术[大结局] --固有的不可移植的特征[下] 三.链接指示:extern "C" C++ 程序有时需要调用用其他程序设计语言编写的函数,最常见的一语言是C 语言.像任何名字一样,必须声明用其他语言编写的函数的名字,该声明必须指定返回类型和形参表.编译器按处理普通 C++ 函数一样的方式检查对外部语言函数的调用,但是,编译器一般必须产生不同的代码来调用用其他语言编写的函数.C++ 使用链接指示指出任意非 C++ 函数所用的语言. 1.声明非C++函数 链接指示不能出现在类定义

《Lost》大结局最权威最彻底解读

Lost大结局最权威最彻底解读: 似乎有一些人还在纠结于Lost最终告诉我们的话:释怀然后继续前进. 所谓"一些人",不仅仅是那些铁杆捞饭--还有些不太关注的观众也在周日的晚上第一次收看了Lost,看看Lost到底是关于什么的.(很疯狂,但他们确实这么做了!) 我正在被有关Lost大结局的问题连番轰炸,所以,不管你是不是Lost的痴迷者,只要还在苦苦思考寻求理解,下面就是对Lost到底是关于什么的完全彻底的解读: 从前有座岛.岛是真实存在的,岛上的人也是真实存在的. 岛的核心是&quo

学习日记之大话设计模式和Effective C++大结局

第一次潜心学习一个月时间,看完了<大话设计模式>和<Effective C++>两本书,两本书的前半部分都比较容易,但是后期的部分,比如:C++的内存,异常和模板的知识就很难理解了.也许和自己很少用异常处理和模板的关系吧.自己坚持了一个月,无论如何,这两本书给我带来了很多新的知识,发现了自己的不足.接下来打算继续看<C++ Templates>这本书,希望能弥补自己在模板编程方便的不足和为以后研究STL和Boost打下坚实的基础.废话少说,言归正传.下面说一下两本书的最

AutoTile 自动拼接(六 大结局) 学习与实践

昨天在网上找了一些资源图片,这回就不用担心 背景资源不多的问题了,现在我一边 制作,一边发布文章. 大结局文章比较多,所以估计得 更新几次,后天完工.不过先睹为快的朋友,可以来瞧瞧 各种各样,500多个,这里还是特别感谢 ,万恶的资本主义,不设密码就给我分享. 在制作前,大家看下这里的图片,和我之前的图片规格,有点不一样,他们大了一号. 细心的朋友,可以拿这张 ,和我 之前的图比较下. 哎,为了这500多张的 图,我也只能稍微改改 切图了,但做法都是一样的. 里面有一些 动画图,需要切一下,我推

火影700话完结 15年完结大结局

火影忍者700话大结局更新了!!鸣人终于当上了火影,老婆是雏田,儿子叫博人,女儿叫日葵,佐助娶了小樱,女儿名字叫莎拉娜,鹿丸和手鞠结婚,儿子叫鹿代. 木叶丸当上了老师,伊鲁卡和赤丸都已经老了,卡卡西收了个新徒弟,佐助在森林里发现里异样. 旗木卡卡西,我们很难有一个定义将他阐述,天才忍者?老师?学生?拷贝忍者--但是,我隐约感到一句话才是这位悲情人物的写照"一个人的感情是有限的,能失去多少,失去多少回,而失去太多之后便所剩无几了."曾经显赫的家族,然而父亲却因为保护同伴放弃任务而最终在众

柯南君:看大数据时代下的IT架构(5)消息队列之RabbitMQ--案例(Work Queues起航)

一.回顾 让我们回顾一下,在上几章里都讲了什么?总结如下: <柯南君:看大数据时代下的IT架构(1)业界消息队列对比> <柯南君:看大数据时代下的IT架构(2)消息队列之RabbitMQ-基础概念详细介绍> <柯南君:看大数据时代下的IT架构(3)消息队列之RabbitMQ-安装.配置与监控> <柯南君:看大数据时代下的IT架构(4)消息队列之RabbitMQ--案例(Helloword起航)> 二.Work Queues(using the Java Cl

大數據下的適用(實利)思維

by 高煥堂 適用思維與實用思維很接近,但是幕後思維邏輯並不完全相同.兩者對大數據的運用角度也大異其趣.大家對實用思維(又稱實用主義)最常見的認知是胡適所說的:大膽假設.小心求證.這項求證包括實證(證實)與否証(證偽)兩種.因此,任何假说(Assumption or Hypothesis),只要它能夠為實驗所檢驗,當它具有這項設想的可能性時,只要我們對它提不出任何特別的反對理由(否證),那麼它就是可以接受的. 適用思維(又稱為實利主義)與實用思維最典型的區分是老子所說:無之以為用.有之以為利.其

百度技术沙龙 - 大数据场景下主题检索应用

第48期百度技术沙龙上的<大数据场景下主题检索应用>讲座介绍了很多训练大规模主题模型的技术细节.讲座回来后,我粗略整理了下讲座上涉及的主题模型和训练大规模模型相关的资料和文献. 1. 主题模型的发展历史 a. 布尔模型 Boolean model b. 向量空间模型 VSM (Vector space model) c. 潜在语义索引 LSI (Latent semantics index) - 首先作为一种降维技术, 对doc-word矩阵进行SVD分解 d. 概率潜在语义分析pLSA e.