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】匹配相关推荐

  1. 【刷题】BZOJ 5154 [Tjoi2014]匹配

    Description 有N个单身的男孩和N个单身女孩,男孩i和女孩j在一起得到的幸福值为Hij.一个匹配即对这N个男孩女孩的安排: 每个男孩恰好有一个女朋友,每个女孩恰好有一个男朋友.一个匹配的幸福 ...

  2. 每周记录(4月底停更了qvq)

    1月6日 旋转卡壳 闵可夫斯基和 1月13日 期末复习 1月20日 网络流前4道题 一场失败的期末考试 写寒假作业 bzoj [HNOI2008]明明的烦恼(90分) prufer序列 正睿 画画图 ...

  3. JZOJ 3600. 【CQOI2014】通配符匹配

    Description Input Output Sample Input *abc?e**e 3 abcee ppabcqexe abcdefgee Sample Output NO YES YES ...

  4. 【栈】【字符】匹配(jzoj 1612)

    匹配 题目大意: 给你一个长度为n的字符串(有多组数据),中间有小写字母(没用的东西)和大写字母,A-M是左括号,与之相对的是右括号Z-N(之所以说是Z-N而不是N-Z是因为只有Z可以和A相对,只有M ...

  5. JZOJ 3742. 【TJOI2014】上升子序列

    Description Input Output Sample Input 4 1 2 3 3 Sample Output 4 Data Constraint 对于30%的数据,N<=5000 ...

  6. 【DP】小学生语文题(jzoj 5102)

    正题 jzoj 5102 题目大意 给你两个串A,B,字母个数相等,可以把B的一个字符移到前面某个位置,问你最少移多少次可以使A,B相等 解题思路 设fi,jf_{i,j}fi,j​为A匹配了i-n, ...

  7. 【最大流】牛棚安排(jzoj 1259)

    牛棚安排 jzoj 1259 题目大意: 有nnn头牛和mmm个牛棚,每头牛有自己第1喜欢,第2喜欢--第mmm喜欢的牛棚(开心度分别为m,m−1,m−2--1m,m-1,m-2--1m,m−1,m− ...

  8. 【状压DP】最优配对问题(jzoj 3420)

    最优配对问题 jzoj 3420 题目大意: 在平面上有n个点,现在要把他们拼成n/2对,拼接两个点的代价是他们的平面距离,现在问代价总和最小是多少 输入样例 4 8730 9323 -3374 39 ...

  9. 【模拟】【递归】解压字符串(jzoj 1519)

    解压字符串 jzoj 1519 题目大意: 有一串压缩过的字符串,将有重复的压缩成了s(~~)的形式(s是一位数,例子:123123123压缩成'3(123)'),现在要你解压出来,然后输出长度 样例 ...

最新文章

  1. python打开一个文件-在“Python”中如何“尝试/抓住”打开一个文件?
  2. 如何解决Silverlight InitializeError #2103 - Invalid or malformed application: Check manifest
  3. C++标准库与STL简介
  4. 北京内推 | 微软亚洲互联网工程院(STCA)招聘NLP科研实习生
  5. MyEclipse使用总结——MyEclipse文件查找技巧
  6. mysql+地图网格数据下载_echarts 中国各省市 echarts地图数据,含世界地图
  7. mysql中的函数有哪些?(1.数字函数)
  8. iOS开发,更改状态栏(StatusBar)文字颜色为白色
  9. LINUX:lpr不能打印,可以试试lp
  10. Emu8086下载和注册
  11. ubuntu软件默认安装位置
  12. HackMyvm(九)Gigachad持续更新
  13. MySQL的EXPLAIN解释器
  14. office安装找不到office.zh cn的解决办法
  15. Chrome浏览器常用快捷键总结
  16. 惠普win7笔记本耳机没声音
  17. 计算机组成原理---指令系统
  18. [译] 为什么设计师讨厌政治(如何解决)
  19. kafka send方法详解 (同步异步) 小白使用记录
  20. 地下城英雄 java_用java开发dota英雄最华丽的技能(实例讲解)

热门文章

  1. Python学习笔记:常用内建模块1
  2. 时频分析:短时傅立叶变换实现(4)
  3. Linux常用命令集锦
  4. 几本国外著名反演书籍(高清版资源)
  5. CUDA Study ---- Hardware Architecture
  6. 分享 C++命名空间的解释
  7. 无线鼠标接收器对码软件_接收器太小容易丢 这几招记好就不怕
  8. sublime编译python文件提示can't find '__main__' module in ' '
  9. 【笔记】基于低空无人机影像和 YOLOv3 实现棉田杂草检测
  10. 科大星云诗社动态20211108