hdu3081 Marriage Match II(最大流)

转载请注明出处: http://www.cnblogs.com/fraud/           ——by fraud

 

Marriage Match II

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2410    Accepted Submission(s): 820


Problem Description
Presumably, you all have known the question of stable marriage match. A girl will choose a boy; it is similar as the game of playing house we used to play when we are kids. What a happy time as so many friends playing together. And it is normal that a fight or a quarrel breaks out, but we will still play together after that, because we are kids. 
Now, there are 2n kids, n boys numbered from 1 to n, and n girls numbered from 1 to n. you know, ladies first. So, every girl can choose a boy first, with whom she has not quarreled, to make up a family. Besides, the girl X can also choose boy Z to be her boyfriend when her friend, girl Y has not quarreled with him. Furthermore, the friendship is mutual, which means a and c are friends provided that a and b are friends and b and c are friend. 
Once every girl finds their boyfriends they will start a new round of this game—marriage match. At the end of each round, every girl will start to find a new boyfriend, who she has not chosen before. So the game goes on and on.
Now, here is the question for you, how many rounds can these 2n kids totally play this game?


Input
There are several test cases. First is a integer T, means the number of test cases. 
Each test case starts with three integer n, m and f in a line (3<=n<=100,0<m<n*n,0<=f<n). n means there are 2*n children, n girls(number from 1 to n) and n boys(number from 1 to n).
Then m lines follow. Each line contains two numbers a and b, means girl a and boy b had never quarreled with each other. 
Then f lines follow. Each line contains two numbers c and d, means girl c and girl d are good friends.


Output
For each case, output a number in one line. The maximal number of Marriage Match the children can play.


Sample Input
1 4 5 2 1 1 2 3 3 2 4 2 4 4 1 4 2 3


Sample Output
2


Author
starvae


Source
HDU 2nd “Vegetable-Birds Cup” Programming Open Contest

 

题意:

有n个女孩和n个男孩,有m个女孩与男孩的关系,代表女孩喜欢男孩,有f个女孩与女孩的关系,代表女孩与女孩是好朋友。

若女孩i与女孩j是好朋友,而女孩i喜欢男孩k,则女孩j也可以和男孩匹配。即女孩之间的关系是可以传递的,而男孩之间的不可以。

每对男孩与女孩之间只能匹配一次,问可以进行几轮配对。

分析:
先floyd搞好女孩之间的传递关系,然后对于可以配对的女孩与男孩之间连一条容量为1的边,然后二分答案,每次二分之后从源点向各个女孩连容量为二分值的边,从各个男孩向汇点连容量为二分值的边。

  1 //#####################
  2 //Author:fraud
  3 //Blog: http://www.cnblogs.com/fraud/
  4 //#####################
  5 #include <iostream>
  6 #include <sstream>
  7 #include <ios>
  8 #include <iomanip>
  9 #include <functional>
 10 #include <algorithm>
 11 #include <vector>
 12 #include <string>
 13 #include <list>
 14 #include <queue>
 15 #include <deque>
 16 #include <stack>
 17 #include <set>
 18 #include <map>
 19 #include <cstdio>
 20 #include <cstdlib>
 21 #include <cmath>
 22 #include <cstring>
 23 #include <climits>
 24 #include <cctype>
 25 using namespace std;
 26 #define XINF INT_MAX
 27 #define INF 0x3FFFFFFF
 28 #define MP(X,Y) make_pair(X,Y)
 29 #define PB(X) push_back(X)
 30 #define REP(X,N) for(int X=0;X<N;X++)
 31 #define REP2(X,L,R) for(int X=L;X<=R;X++)
 32 #define DEP(X,R,L) for(int X=R;X>=L;X--)
 33 #define CLR(A,X) memset(A,X,sizeof(A))
 34 #define IT iterator
 35 typedef long long ll;
 36 typedef pair<int,int> PII;
 37 typedef vector<PII> VII;
 38 typedef vector<int> VI;
 39 #define MAXN 1010
 40 struct edge{
 41     int to,cap,rev;
 42     edge(int _to,int _cap,int _rev)
 43     {
 44         to=_to;
 45         cap=_cap;
 46         rev=_rev;
 47     }
 48 };
 49 const int MAX_V=5020;
 50 vector<edge>G[MAX_V];
 51 int iter[MAX_V];
 52 int head[MAXN];
 53 int _to[510*510];
 54 int _flow[510*510];
 55 int _next[510*510];
 56 int level[MAX_V];
 57 int tot=0;
 58 void add_edge(int from,int to,int cap)
 59 {
 60     G[from].PB(edge(to,cap,G[to].size()));
 61     G[to].PB(edge(from,0,G[from].size()-1));
 62 }
 63 void Add(int u,int v,int f){
 64     _to[tot]=v;
 65     _flow[tot]=f;
 66     _next[tot]=head[u];
 67     head[u]=tot++;
 68 }
 69 void bfs(int s,int t)
 70 {
 71     CLR(level,-1);
 72     queue<int>q;
 73     level[s]=0;
 74     q.push(s);
 75     while(!q.empty())
 76     {
 77         int u=q.front();
 78         q.pop();
 79         for(int i=0;i<G[u].size();i++)
 80         {
 81             edge &e=G[u][i];
 82             if(e.cap>0&&level[e.to]<0)
 83             {
 84                 level[e.to]=level[u]+1;
 85                 q.push(e.to);
 86             }
 87         }
 88     }
 89 }
 90 int dfs(int v,int t,int f)
 91 {
 92     if(v==t)return f;
 93     for(int &i=iter[v];i<G[v].size();i++)
 94     {
 95         edge &e=G[v][i];
 96         if(e.cap>0&&level[v]<level[e.to])
 97         {
 98             int d=dfs(e.to,t,min(f,e.cap));
 99             if(d>0)
100             {
101                 e.cap-=d;;
102                 G[e.to][e.rev].cap+=d;
103                 return d;
104             }
105         }
106     }
107     return 0;
108 }
109 int Dinic(int s,int t)
110 {
111     int flow=0;
112     for(;;)
113     {
114         bfs(s,t);
115         if(level[t]<0)return flow;
116         memset(iter,0,sizeof(iter));
117         int f;
118         while((f=dfs(s,t,INF))>0)
119         {
120             flow+=f;
121         }
122     }
123 }
124 
125 int a[210][210];
126 
127 int main()
128 {
129     ios::sync_with_stdio(false);
130     int t;
131     scanf("%d",&t);
132     while(t--){
133         int n,m,f;
134         scanf("%d%d%d",&n,&m,&f);
135         tot=0;
136         for(int i=0;i<MAXN;i++)head[i]=-1;
137         int u,v;
138         memset(a,0,sizeof(a));
139         for(int i=0;i<m;i++){
140             scanf("%d%d",&u,&v);
141             a[u][v+n]=1;
142         }
143         for(int i=0;i<f;i++){
144             scanf("%d%d",&u,&v);
145             a[u][v]=1;
146             a[v][u]=1;
147         }
148         for(int i=1;i<=n+n;i++)a[i][i]=1;
149         for(int k=1;k<=n+n;k++){
150             for(int i=1;i<=n+n;i++){
151                 for(int j=1;j<=n+n;j++){
152                     a[i][j]=max(a[i][j],a[i][k]&a[k][j]);
153                 }
154             }
155         }
156         for(int i=1;i<=n;i++){
157             for(int j=1+n;j<=n+n;j++){
158                 if(a[i][j])Add(i,j,1);
159             }
160         }
161         int l=0,r=n;
162         int s=0,t=2*n+1;
163         int ans=0;
164         while(l<=r){
165             int mid=(l+r)>>1;
166             for(int i=0;i<=2*n+1;i++)G[i].clear();
167             for(int i=1;i<=2*n;i++){
168                 int now=head[i];
169                 while(now!=-1){
170                     add_edge(i,_to[now],_flow[now]);
171                     now=_next[now];
172                 }
173             }
174             for(int i=1;i<=n;i++){
175                 add_edge(s,i,mid);
176                 add_edge(n+i,t,mid);
177             }
178             if(Dinic(s,t)==mid*n){
179                 ans=mid;
180                 l=mid+1;
181             }
182             else r=mid-1;
183         }
184         printf("%d\n",ans);
185     }
186         
187                     
188             
189     return 0;
190 }
代码君

 

转载于:https://www.cnblogs.com/fraud/p/4354766.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

log4net 日志框架的配置

log4net 日志框架的简单配置 添加对log4net程序集的引用 选择程序集文件添加引用即可&#xff0c;需要注意的是需要添加相应程序版本的程序集&#xff0c;如果你的应用是基于.netFramework2.0&#xff0c;则应选择net 2.0版本的程序集 修改配置文件&#xff0c;配置log4net相…

CSS 设计指南(第3版) 初读笔记

第1章 HTML标记与文档结构 关于<title>标签&#xff1a;搜索引擎会给<title>标签中的文字内容赋予很高的权重。而且这些文字也会作为网页标题出现在搜索结果列表中。 无论你想了解哪个HTML元素&#xff0c;第一个要问的问题都应该是&#xff1a;它是块元素&#xf…

Objective-C中的@property和@synthesize用法

代表“Objective-C”的标志&#xff0c;证明您正在使用Objective-C语言 Objective-C语言关键词&#xff0c;property与synthesize配对使用。 功能&#xff1a;让编译好器自动编写一个与数据成员同名的方法声明来省去读写方法的声明。 如&#xff1a; 1、在头文件中&#xff1a;…

Android用户界面程序设计示例

[例1]按钮和Toast弹出对话框 1 [例2] TextView文本框 &#xff08;1&#xff09; 3 [例3]TextView文本框 &#xff08;2&#xff09; 4 [例4]编辑框EditText 4 [例5]单选RadioButton 6 [例6]Toast的用法简介 8 [例7]多选checkbox 12 [例8]菜单Menu 14 …

Spring Thread Pool 线程池的应用

Spring and Java Thread example 扫扫关注“茶爸爸”微信公众号坚持最初的执着&#xff0c;从不曾有半点懈怠&#xff0c;为优秀而努力&#xff0c;为证明自己而活。Download it – Spring-Thread-Example.zip (22 KB)转自&#xff1a;http://www.mkyong.com/spring/spring-and…

Emule使用Upnp,解决Lowid和port not reachable的问题

路由器上钩选开启Upnp Emule->选择->扩展选项->Upnp&#xff0c; 服务器&#xff1a;【从URL更新】http://upd.emule-security.org/server.met转载于:https://www.cnblogs.com/zhyong/p/4422139.html

Android动画及滑动事件冲突解决(转载)

原文链接&#xff1a;http://blog.csdn.net/singwhatiwanna/article/details/38168103 Android开发中动画和事件处理是程序员迈向高手的必经之路&#xff0c;也是重点和难点。 此篇转载文章思路清晰&#xff0c;结构合理&#xff0c;用图文混合的方式完美的讲解了动画和事件冲突…

使用临时表解决union和order by不能同时使用的问题

最近遇见了这样一个问题&#xff0c;有4张表&#xff0c;A&#xff08;单据&#xff09;表&#xff0c;B&#xff08;产品&#xff09;表&#xff0c;C&#xff08;产品类型&#xff09;&#xff0c;D&#xff08;单据产品关联表&#xff09;。 B表有唯一对应的类型C&#xff…

2.3线性表的链式存储和运算—双向链表

以上讨论的单链表的结点中只有一个指向其后继结点的指针域next&#xff0c;因此若已知某结点的指针为p&#xff0c;其后继结点的指针则为p->next &#xff0c;而找其前驱则只能从该链表的头指针开始&#xff0c;顺着各结点的next 域进行&#xff0c;也就是说找后继的时间性能…

通过栈(Stack)实现对树的遍历

说到数的遍历树&#xff0c;长期以来的第一印象都是通过递归去实现。然而今天看了某位前辈的代码&#xff0c;才发现使用栈去实现遍历是那么简单。理论上通过数组也是可以实现同等功能的&#xff0c;毕竟Stack也是通过数据去实现的。 package com.sysway.ui.widget;import jav…

StroyBoard中UICollectionView中添加Header和footer

到Storyboard中&#xff0c;选择collection view controller中的"Collection View"。在Attributes inspector中&#xff0c;选择"Section Header"和"Section Footer",一旦选中你就会在屏幕中看到下面的的显示&#xff1a; 最重要的是&#xff0c…

树形结构数据汇总查询解决方案+优化求助

最近遇到一个地区数据汇总的问题&#xff0c;地区下的地址呈树形结构&#xff0c;&#xff08;简化结构&#xff09;如A市下有B、C区&#xff0c;B区下有D、E街道。先要查询所有地区的人数&#xff08;包括子区域&#xff09;&#xff0c;如A的人数直属A的人数B的人数C的人数D的…

Dom4j 学习笔记

dom4j 是一种解析 XML 文档的开放源代码 XML 框架。dom4j下载地址 本文主要记载了一些简单的使用方法。 一、xml文件的解析 dom4j既可以解析普通的xml文件&#xff0c;也可以解析一个InputStream&#xff0c;先看看xml文件长什么样子&#xff1a; <books><book>&l…

交叉连接(CROSS JOIN)的实际应用

一次偶然的机会&#xff0c;使用到了万年不用的交叉连接&#xff08;CROSS JOIN&#xff09; 业务场景如下&#xff1a; 1、存在多个运营商&#xff0c;每个运营商下面都有各种类型的设备&#xff0c;不同运营商的设备不完全相同&#xff1b; 2、任何设备有且仅有两种用途‘…

C# xml文件读取与修改

c#读写xml文件已知有一个XML文件&#xff08;bookstore.xml&#xff09;如下&#xff1a; Code<?xml version"1.0" encoding"gb2312"?><bookstore> <book genre"fantasy" ISBN"2-3631-4"> <title>Obero…

外连接从表过滤

1、使用left join时从表的过滤 WITH a AS( SELECT A aid FROM dual UNION ALL SELECT B FROM dual UNION ALL SELECT C FROM dual UNION ALL SELECT D FROM dual UNION ALL SELECT E FROM dual ), b AS( SELECT A aid,10 num,1 type FROM dual UNION ALL SELECT B,20,2 FROM d…

ORACLE将查询字段指定为某种类型

SELECT CAST(张三 AS VARCHAR2(20)) name FROM dual; 一般来说在查询时很少有用到这种语句&#xff0c;但是使用CREATE TABLE ... AS SELECT ...语句的时候这个就很好用了 --建表 CREATE TABLE test01 AS SELECT 张三 name FROM dual; --正常插入数据 INSERT INTO test01 SEL…

分组查询最晚一条数据(ORACLE)

现有客户表&#xff0c;交费表&#xff0c;需查询每个存在交费记录客户的最后一笔交费信息 这里提供两种方式 注&#xff1a;客户不会在同一时间有两条交费&#xff0c;SQL可直接执行 --查询客户名称&#xff0c;最后一笔交费时间&#xff0c;以及最后一笔交费金额 WITH --客…

ORACLE循环中使用序列

在批量生成数据时&#xff0c;经常会用到序列的Nextval&#xff0c;今天碰到了这样的情况&#xff0c;日常记录&#xff0c;下附解决方案。先看这段脚本 DECLARE i INTEGER; BEGINFOR cur IN 1..5 LOOPi : DomainObjectId.Nextval;dbms_output.put_line(i);END LOOP; END; 编…

mysql001创建数据库

-- 注释&#xff0c;ctrl/ -- 查询所有数据库&#xff1b; show DATABASES; -- 创建数据库; CREATE DATABASE studb; -- 切换数据库; USE studb; -- 删除数据库 DROP DATABASE studb;