P1231 教辅的组成

题目背景

滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西。

题目描述

蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题。然而出现在他眼前的书多得数不胜数,其中有书,有答案,有练习册。已知一个完整的书册均应该包含且仅包含一本书、一本练习册和一份答案,然而现在全都乱做了一团。许多书上面的字迹都已经模糊了,然而HansBug还是可以大致判断这是一本书还是练习册或答案,并且能够大致知道一本书和答案以及一本书和练习册的对应关系(即仅仅知道某书和某答案、某书和某练习册有可能相对应,除此以外的均不可能对应)。既然如此,HansBug想知道在这样的情况下,最多可能同时组合成多少个完整的书册。

输入输出格式

输入格式:

第一行包含三个正整数N1、N2、N3,分别表示书的个数、练习册的个数和答案的个数。

第二行包含一个正整数M1,表示书和练习册可能的对应关系个数。

接下来M1行每行包含两个正整数x、y,表示第x本书和第y本练习册可能对应。($1 \le x \le N1,1\le y\le N2 $)

第M1+3行包含一个正整数M2,表述书和答案可能的对应关系个数。

接下来M2行每行包含两个正整数x、y,表示第x本书和第y本答案可能对应。(\(1 \le x \le N1,1 \le y \le N3\))

输出格式:

输出包含一个正整数,表示最多可能组成完整书册的数目。

输入输出样例

输入样例#1:

5 3 4
5
4 3
2 2
5 2
5 1
5 3
5
1 3
3 1
2 2
3 3
4 3

输出样例#1:

2

说明

样例说明:

如题,N1=5,N2=3,N3=4,表示书有5本、练习册有3本、答案有4本。

M1=5,表示书和练习册共有5个可能的对应关系,分别为:书4和练习册3、书2和练习册2、书5和练习册2、书5和练习册1以及书5和练习册3。

M2=5,表示数和答案共有5个可能的对应关系,分别为:书1和答案3、书3和答案1、书2和答案2、书3和答案3以及书4和答案3。

所以,以上情况的话最多可以同时配成两个书册,分别为:书2+练习册2+答案2、书4+练习册3+答案3。

数据规模:

对于数据点1, 2, 3,\(M1,M2\le 20\)

对于数据点4~10,\(M1,M2 \le 20000\)


算法

网络最大流。这里不详细讲,请大家先掌握。

思路

注意,以下出现的所有边边权皆为1,且其反向边边权为0

我们以书、练习册、答案为点建图。
像这样:

S(=0)表示额外建的一个起始点,Ri(=i+N1+N1)表示第i本练习册,Di(=i+N1+N1+N2)表示第i本答案,由于书只有一本,而网络流处理只经过一个点不方便,我们采用一种神奇方法——拆点!也就是说,把一本书看做两个点,要匹配这本书必须经过这本书两点之间的边,这样就可以控制这本书只匹配一次。如图,Pi(=i)、Pi'(=i+N1)表示第i本书。

然后建边。如图,将S与所有Ri相连,将所有的Di与T相连,S作为源点,T作为汇点。如果Pi能匹配Rj,就将Pi与Rj相连。如果Pi能匹配Dj,就将Dj与Pi'之间相连。当然,Pi与Pi'之间也要连一条边。

然后就可以套网络最大流辣。最后得出的答案即为最多的数目。

代码

#include<bits/stdc++.h>
using namespace std;
#define open(s) freopen( s".in", "r", stdin ), freopen( s".out", "w", stdout )
#define MAXN 40005
#define MAXM 150000int N1, N2, N3;
int M1, M2;
int hd[MAXN], nxt[MAXM << 1], to[MAXM << 1], val[MAXM << 1], tot(1);
int ans, dis[MAXN];
queue<int> Q;
bool vis[MAXN];int x, y;
int S, T;void Add( int x, int y, int z ){ nxt[++tot] = hd[x]; hd[x] = tot; to[tot] = y; val[tot] = z; }bool BFS(){while( !Q.empty() ) Q.pop();memset( dis, 0, sizeof dis );Q.push(S); dis[S] = 1;while( !Q.empty() ){x = Q.front(); Q.pop();for ( int i = hd[x]; i; i = nxt[i] )if ( val[i] && !dis[to[i]] ){dis[to[i]] = dis[x] + 1;Q.push( to[i] );if ( to[i] == T ) return 1;}}return 0;
}int DFS( int x, int fl ){if ( x == T ) return fl;int res(fl), k;for ( int i = hd[x]; i && res; i = nxt[i] ){if ( val[i] && dis[to[i]] == dis[x] + 1 ){k = DFS( to[i], min( res, val[i] ) );if ( !k ) dis[to[i]] = 0;val[i] -= k; val[i^1] += k; res -= k;}}return fl - res;
}int main(){scanf( "%d%d%d", &N1, &N2, &N3 );scanf( "%d", &M1 );for ( int i = 1; i <= M1; ++i ){scanf( "%d%d", &x, &y ); Add( y + N1, x, 1 ); Add( x, y + N1, 0 );}scanf( "%d", &M2 );for ( int i = 1; i <= M2; ++i ){scanf( "%d%d", &x, &y ); Add( x + N1 + N2 + N3, y + N1 + N2, 1 ); Add( y + N1 + N2, x + N1 + N2 + N3, 0 );}S = 0; T = 1 + N1 + N1 + N2 + N3;for ( int i = 1; i <= N2; ++i ) Add( S, i + N1, 1 ), Add( i + N1, S, 0 );for ( int i = 1; i <= N3; ++i ) Add( i + N1 + N2, T, 1 ), Add( T, i + N1 + N2, 0 );for ( int i = 1; i <= N1; ++i ) Add( i, i + N1 + N2 + N3, 1 ), Add( i + N1 + N2 + N3, i, 0 );int t;while( BFS() )while( ( t = DFS( S, 0x7f7f7f7f ) ) > 0 ) ans += t;printf( "%d\n", ans );return 0;
}

转载于:https://www.cnblogs.com/louhancheng/p/10118942.html

「洛谷P1231」教辅的组成 解题报告相关推荐

  1. 「洛谷P1343」地震逃生 解题报告

    P1343 地震逃生 题目描述 汶川地震发生时,四川XX中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有n个点,m条边.1号点为教室,n号点为安全地带, ...

  2. 「洛谷2495」「BZOJ3052」「SDOI2001」消耗战【虚树+树形动态规划】

    题目大意 给你\(k\)个点,让这一些点和一号节点断开,删去某一些边,求最小的删去边权之和. 做题的心路历程 做了\(HG\)昨天的模拟赛,深深感觉到了窝的菜,所以为了\(A\)掉T1这一道毒瘤,窝就 ...

  3. 【洛谷 - P1231 】教辅的组成(网络流最大流,拆点)

    题干: 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书多得数不胜数,其中有书,有答案,有练习册.已知一个完整的书册均应该包含 ...

  4. 「洛谷P2397」 yyy loves Maths VI (mode) 解题报告

    P2397 yyy loves Maths VI (mode) 题目背景 自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居 ...

  5. 「洛谷P3469」[POI2008]BLO-Blockade 解题报告

    P3469[POI2008]LO-Blockade 题意翻译 在Byteotia有n个城镇. 一些城镇之间由无向边连接. 在城镇外没有十字路口,尽管可能有桥,隧道或者高架公路(反正不考虑这些).每两个 ...

  6. 「洛谷 3768」简单的数学题

    传送门 problem 给定 nnn 和 ppp,求: ∑i=1n∑j=1nijgcd⁡(i,j)\sum_{i=1}^n\sum_{j=1}^nij\gcd(i,j)i=1∑n​j=1∑n​ijgc ...

  7. 「洛谷 P5043」:树同构【树哈希】

    P5043 [模板]树同构([BJOI2015]树的同构 题目描述 树是一种很常见的数据结构. 我们把NNN个点,N−1N−1N−1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点 ...

  8. 洛谷 P3332 [ZJOI2013]K大数查询 解题报告

    P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...

  9. 洛谷 P2114 [NOI2014]起床困难综合症 解题报告

    P2114 [NOI2014]起床困难综合症 题目描述 21世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm一直坚持与起床困难综合症作 ...

  10. 洛谷 P2463 [SDOI2008]Sandy的卡片 解题报告

    P2463 [SDOI2008]Sandy的卡片 题意 给\(n(\le 1000)\)串,定义两个串相等为"长度相同,且一个串每个数加某个数与另一个串完全相同",求所有串的最长公 ...

最新文章

  1. li浮动时ul自适应高度方法
  2. 解决vue-awesome-swiper中swiper/css/swiper.css无法导入问题
  3. SD--关于定价过程中的存储顺序的参考结构和参考字段的使用代码跟踪
  4. java 访问线程_java线程简介(共享对数据的访问)
  5. 关于ASP.NET MVC
  6. 85元一个万能工具箱,配齐24种螺丝刀+扳手,媲美德国工艺,家庭必备
  7. linux 账号密码 字段,详解Linux中的用户密码管理命令passwd和change
  8. Windows驱动—VS2010+WDK配置驱动开发环境
  9. 35款非常有创意的透明名片设计作品
  10. 产品要想跑得赢,政策定价来帮您
  11. oracle--索引--
  12. JAVAWeb项目 微型商城项目-------(一)项目描述
  13. 中燃料场报表生成器--出库报表
  14. 使用js进行智慧树刷课
  15. C# 操作Excel(不需要安装Excel),.Net版的 Excel 控件
  16. Java开发最容易踩的十个大坑,每条都是教训
  17. h5制作导出html,H5制作工具Hype的导出功能详解
  18. Delayed Project(下)
  19. MSN Spaces
  20. 开源的杀毒软件--ClamWin

热门文章

  1. cookie和session基础以及在Django中应用
  2. CentOS安装vim
  3. mysql查看锁表锁进程
  4. SQL将本地图片文件插入到数据库
  5. 在vue的项目中引入swiper插件
  6. IOS之Core Foundation框架和Cocoa Foundation框架的区别
  7. 【bzoj1022】[SHOI2008]小约翰的游戏John 博弈论
  8. PHP 实现简单购物车功能(2)
  9. (十)unity4.6学习Ugui中文文档-------參考-UGUI Canvas Components
  10. DDD中的Specification模式