博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu4685 n个男生m个女生问男生可以娶哪些女生使最大匹配数不改变:二分图匹配/tarjan...
阅读量:5813 次
发布时间:2019-06-18

本文共 1355 字,大约阅读时间需要 4 分钟。

(男生喜欢特定的女生,女生可以嫁给任何男生=

先按题意求出最大匹配,然后在左边增加n-res个虚拟男生喜欢所有女生,m-res个虚拟女生喜欢所有男生,再求最大匹配,这个时候肯定是个完全匹配,求匹配只是确定新的二分图里面每个男生对应的女生是谁=

在所有女生女生里面建有向图,将某男生匹配的女生连向所有他喜欢的女生一条边,求一遍tarjan,这样所有和他匹配的女生在一个连通分量里面的女生都可以选=

为什么?因为可以间接交换而不改变匹配数!

本来明白思路之后很快就打完了,却一直TLE,T了一个下午wocao!百思不得其解!

然后在一下午的修改,查找后终于发现了bug,在代码的92行,刚开始我没加&&g[i][j]这个条件,当时打代码没细想,觉得在一个环就肯定能交换,忘了男生要喜欢这个女生==but!艹!特么给我wa还能解释,TLE我现在还是不能接受,好醉===

1 #include
2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 stack
s; 8 vector
G[1105]; 9 int g[1105][1105],y[1105],link[1105],linky[1105]; 10 int dfs_clock,scc_cnt,pre[1105],lowlink[1105],sccno[1105]; 11 int n1,n2,d[1105],ans[1105][1105]; 12 int dfs(int u){ 13 for (int i=1;i<=n2;i++) 14 if (g[u][i]&&!y[i]){ 15 y[i]=1; 16 if (!link[i]||dfs(link[i])){ 17 link[i]=u; 18 return 1; 19 } 20 } 21 return 0; 22 } 23 int maxmatch(){ 24 memset(link,0,sizeof(link)); 25 int ans=0; 26 for (int i=1;i<=n1;i++){ 27 memset(y,0,sizeof(y)); 28 if (dfs(i)) ans++; 29 } 30 return ans; 31 } 32 void tarjan(int u){ 33 int v; 34 pre[u]=lowlink[u]=++dfs_clock; 35 s.push(u); 36 for (int i=0;i
View Code

题目链接:

转载于:https://www.cnblogs.com/xiao-xin/articles/4403420.html

你可能感兴趣的文章
html语言
查看>>
从源码看集合ArrayList
查看>>
spring-boot支持websocket
查看>>
菜鸟笔记(一) - Java常见的乱码问题
查看>>
我理想中的前端工作流
查看>>
记一次Git异常操作:将多个repository合并到同一repository的同一分支
查看>>
CodeIgniter 3.0 新手捣鼓源码(一) base_url()
查看>>
Chrome 广告屏蔽功能不影响浏览器性能
查看>>
vSphere 6将于2月2日全球同步发表
查看>>
Android状态栏实现沉浸式模式
查看>>
让你的APP实现即时聊天功能
查看>>
iOS 绝对路径和相对路径
查看>>
使用Openfiler搭建ISCSI网络存储
查看>>
iOS - UIViewController
查看>>
IntPtr 转 string
查看>>
学生名单
查看>>
(转) 多模态机器翻译
查看>>
【官方文档】Nginx负载均衡学习笔记(三) TCP和UDP负载平衡官方参考文档
查看>>
矩阵常用归一化
查看>>
Oracle常用函数总结
查看>>