JZOJ 3739. 【TJOI2014】匹配
Description
Input
Output
Sample Input
3
1 1 1
2 1 1
1 1 1
Sample Output
4
2 1
Data Constraint
对于30%的数据,N<=30
对于100%的数据,N<=80
Solution
这题挺熟悉,典型的最大匹配
可是它的第二问是求最大匹配的交集,这使我一下子没了思绪
后来我才猛然想到:这可以用费用流来做!
先求完美匹配的值,于是设源点和汇点;
源点向每个男孩各连一条容量为 1 、费用为 0 的边;
每个女孩各向汇点连一条容量为 1 、费用为 0 的边;
最后每个男孩各向每个女孩连一条容量为 1 、费用为 1 的边。
之后跑一遍最大费用最大流就可以啦!
而所谓的交集,就可以枚举最大匹配的每一条边,
将其删除之后重新求最大匹配,若最大匹配发生变化则说明这条边在交集中!
注意:枚举的边必须是求解时使用过的边,否则没有必要枚举。
Code
#include<cstdio>
#include<cstring>
using namespace std;
const int N=200;
struct data
{int x,y;
}a[N*N];
int n,t,ans,tot,num;
int f[N][N],c[N][N],b[N][N];
int que[N*4],dis[N],pre[N];
bool bz[N];
inline int read()
{int data=0; char ch=0;while(ch<'0' || ch>'9') ch=getchar();while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();return data;
}
inline bool spfa()
{memset(dis,128,sizeof(dis));int l=que[1]=dis[0]=0,r=1;while(l<r){int now=que[++l];bz[now]=false;for(int i=0;i<=t;i++)if(f[now][i] && dis[now]+c[now][i]>dis[i]){dis[i]=dis[now]+c[now][i];pre[i]=now;if(!bz[i]) bz[que[++r]=i]=true;}}return dis[t]>0;
}
inline int work()
{int sum=0;for(int i=t;i;i=pre[i]){f[pre[i]][i]--;f[i][pre[i]]++;sum+=c[pre[i]][i];}return sum;
}
int main()
{n=read(),t=n*2+1;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){f[i][n+j]=1;c[i][n+j]=read();c[n+j][i]=-c[i][n+j];}f[0][i]=f[n+i][t]=1;}memcpy(b,f,sizeof(b));while(spfa()) ans+=work();printf("%d\n",ans);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(!f[i][n+j]){a[++tot].x=i;a[tot].y=n+j;}for(int i=1;i<=tot;i++){memcpy(f,b,sizeof(f));int cnt=f[a[i].x][a[i].y]=0;while(spfa()) cnt+=work();if(cnt<ans) printf("%d %d\n",a[i].x,a[i].y-n);}return 0;
}
JZOJ 3739. 【TJOI2014】匹配相关推荐
- 【刷题】BZOJ 5154 [Tjoi2014]匹配
Description 有N个单身的男孩和N个单身女孩,男孩i和女孩j在一起得到的幸福值为Hij.一个匹配即对这N个男孩女孩的安排: 每个男孩恰好有一个女朋友,每个女孩恰好有一个男朋友.一个匹配的幸福 ...
- 每周记录(4月底停更了qvq)
1月6日 旋转卡壳 闵可夫斯基和 1月13日 期末复习 1月20日 网络流前4道题 一场失败的期末考试 写寒假作业 bzoj [HNOI2008]明明的烦恼(90分) prufer序列 正睿 画画图 ...
- JZOJ 3600. 【CQOI2014】通配符匹配
Description Input Output Sample Input *abc?e**e 3 abcee ppabcqexe abcdefgee Sample Output NO YES YES ...
- 【栈】【字符】匹配(jzoj 1612)
匹配 题目大意: 给你一个长度为n的字符串(有多组数据),中间有小写字母(没用的东西)和大写字母,A-M是左括号,与之相对的是右括号Z-N(之所以说是Z-N而不是N-Z是因为只有Z可以和A相对,只有M ...
- JZOJ 3742. 【TJOI2014】上升子序列
Description Input Output Sample Input 4 1 2 3 3 Sample Output 4 Data Constraint 对于30%的数据,N<=5000 ...
- 【DP】小学生语文题(jzoj 5102)
正题 jzoj 5102 题目大意 给你两个串A,B,字母个数相等,可以把B的一个字符移到前面某个位置,问你最少移多少次可以使A,B相等 解题思路 设fi,jf_{i,j}fi,j为A匹配了i-n, ...
- 【最大流】牛棚安排(jzoj 1259)
牛棚安排 jzoj 1259 题目大意: 有nnn头牛和mmm个牛棚,每头牛有自己第1喜欢,第2喜欢--第mmm喜欢的牛棚(开心度分别为m,m−1,m−2--1m,m-1,m-2--1m,m−1,m− ...
- 【状压DP】最优配对问题(jzoj 3420)
最优配对问题 jzoj 3420 题目大意: 在平面上有n个点,现在要把他们拼成n/2对,拼接两个点的代价是他们的平面距离,现在问代价总和最小是多少 输入样例 4 8730 9323 -3374 39 ...
- 【模拟】【递归】解压字符串(jzoj 1519)
解压字符串 jzoj 1519 题目大意: 有一串压缩过的字符串,将有重复的压缩成了s(~~)的形式(s是一位数,例子:123123123压缩成'3(123)'),现在要你解压出来,然后输出长度 样例 ...
最新文章
- python打开一个文件-在“Python”中如何“尝试/抓住”打开一个文件?
- 如何解决Silverlight InitializeError #2103 - Invalid or malformed application: Check manifest
- C++标准库与STL简介
- 北京内推 | 微软亚洲互联网工程院(STCA)招聘NLP科研实习生
- MyEclipse使用总结——MyEclipse文件查找技巧
- mysql+地图网格数据下载_echarts 中国各省市 echarts地图数据,含世界地图
- mysql中的函数有哪些?(1.数字函数)
- iOS开发,更改状态栏(StatusBar)文字颜色为白色
- LINUX:lpr不能打印,可以试试lp
- Emu8086下载和注册
- ubuntu软件默认安装位置
- HackMyvm(九)Gigachad持续更新
- MySQL的EXPLAIN解释器
- office安装找不到office.zh cn的解决办法
- Chrome浏览器常用快捷键总结
- 惠普win7笔记本耳机没声音
- 计算机组成原理---指令系统
- [译] 为什么设计师讨厌政治(如何解决)
- kafka send方法详解 (同步异步) 小白使用记录
- 地下城英雄 java_用java开发dota英雄最华丽的技能(实例讲解)