链接

http://acm.hdu.edu.cn/showproblem.php?pid=4685

题意

nnn 个王子,mmm 个公主,每个王子可以娶他喜欢的公主中的一个,每个公主只能嫁个一个王子,必须保证最大匹配,升序输出每个王子可以娶的公主的编号

思路

先求二分图最大匹配,给两边未匹配的点添加虚点凑成完美匹配(虚点与另一边所有点之间都要加一条有向边)

然后在所有匹配的两点之间加一条反向边

最后求强连通分量,每个强连通分量中与王子直接相连的公主就是他可以娶的公主

代码

#include<bits/stdc++.h>
#define SZ(x) (int)(x).size()
#define ALL(x) (x).begin(),(x).end()
#define PB push_back
#define MP make_pair
#define FI first
#define SE second
using namespace std;
typedef double DB;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef vector<PII> VPII;
//head
const int N=2005;
int n,n1,n2;
int cnt,dfn[N],low[N],cnt_scc,top,stk[N],c[N],match[N];
bool vis[N][N],ins[N],st[N];
VI G[N],scc[N];
void tarjan(int u) {dfn[u]=low[u]=++cnt;stk[++top]=u;ins[u]=true;for(auto v:G[u]) {if(!dfn[v]) {tarjan(v);low[u]=min(low[u],low[v]);}else if(ins[v]) low[u]=min(low[u],dfn[v]);}if(dfn[u]==low[u]) {++cnt_scc;int x;do {x=stk[top--];ins[x]=false;c[x]=cnt_scc;if(x>n1&&x<=n1+n2) scc[cnt_scc].PB(x);} while(u!=x);}
}
void shrink() {for(int i=1;i<=cnt_scc;i++) scc[i].clear();cnt=cnt_scc=top=0;for(int i=1;i<=n;i++) dfn[i]=low[i]=c[i]=0,ins[i]=false;for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);for(int i=1;i<=cnt_scc;i++) sort(ALL(scc[i]));
}
bool dfs(int u) {for(auto v:G[u]) {if(st[v]) continue;st[v]=true;if(match[v]==-1||dfs(match[v])) {match[u]=v;match[v]=u;return true;}}return false;
}
void hungary() {int res=0;for(int i=1;i<=n;i++) match[i]=-1;for(int i=1;i<=n1;i++) {for(int j=1;j<=n;j++) st[j]=false;dfs(i);}
}
int main() {//freopen("D:/Program Files (x86)/Sublime Text 3/in.txt","r",stdin);int T;scanf("%d",&T);for(int cs=1;cs<=T;cs++) {for(int i=1;i<=n;i++) {G[i].clear();for(int j=1;j<=n;j++)vis[i][j]=false;}scanf("%d%d",&n1,&n2);for(int u=1;u<=n1;u++) {int t;scanf("%d",&t);for(int j=1;j<=t;j++) {int v;scanf("%d",&v);v+=n1;G[u].PB(v);vis[u][v]=true;}}n=n1+n2;hungary();int t=0;for(int i=n1+1;i<=n1+n2;i++) {if(match[i]!=-1) continue;n++;t++;match[n]=i;match[i]=n;for(int j=n1+1;j<=n1+n2;j++)G[n].PB(j);}for(int i=1;i<=n1;i++) {if(match[i]!=-1) continue;n++;match[i]=n;match[n]=i;for(int j=1;j<=n1;j++)G[j].PB(n);}for(int i=1;i<=n1;i++) G[match[i]].PB(i);for(int i=n1+n2+1;i<=n1+n2+t;i++) G[match[i]].PB(i);shrink();printf("Case #%d:\n",cs);VI res;for(int u=1;u<=n1;u++) {for(auto v:scc[c[u]])if(vis[u][v])res.PB(v-n1);printf("%d",SZ(res));for(auto x:res)printf(" %d",x);puts("");res.clear();}}return 0;
}

HDU 4685. Prince and Princess相关推荐

  1. HDU 4685 Prince and Princess(二分匹配加点建图+强连通分量)

    题目链接 Problem Description There are n princes and m princesses. Princess can marry any prince. But pr ...

  2. HDU 4685 Prince and Princess(二分图+强连通分量)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4685 题意:给出n个王子和m个公主.每个王子有一些自己喜欢的公主可以匹配.设最大匹配为M.那么对于每个 ...

  3. HDU - 4685 Prince and Princess(强连通缩点+二分图完备匹配)

    题目链接:点击查看 题目大意:给出n个王子和m个公主,每个王子都有喜欢的公主,题目需要我们在尽可能多的王子可以匹配到喜欢的公主的情况下,求出每个王子所能娶的所有公主,必须保证王子娶了其中任何一个之后, ...

  4. HDU4685:Prince and Princess(二分图匹配+tarjan)

    Prince and Princess Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Othe ...

  5. H - Prince and Princess 计蒜客 - 42402

    H - Prince and Princess 计蒜客 - 42402 题意: 你现在要寻找公主,有三种人,第一种是说真话的人(至少为1,因为公主是说真话的人),第二种人是只会说假话的,第三种是胡说八 ...

  6. uva10635 Prince and Princess LCS 变 lIS

    // uva10635 Prince and Princess LCS 变 lIS // 本意求LCS,但是规模有60000多,复杂度肯定不够 // 注意如果俩个序列的值的范围相同,那么可以在一个 / ...

  7. Prince and Princess问题解决

    摘要 这是突然看到的一个非常有意思的题,是ACM-ICPC的原题,在这里稍微做一些分析,希望对大家有帮助. Prince and Princess 题面 王子m和公主Hff相爱,想要娶公主.虽然公主非 ...

  8. Prince and Princess HDU - 4685

    题意: 有 n 个王子和 m 个公主,每个王子有 kik_iki​ 个喜欢的公主,每个公主都喜欢所有的王子,询问每个王子可能会和哪些公主匹配. 题解: 首先 n 个王子 和 m 个公主做一次二分匹配, ...

  9. hdu 4090--GemAnd Prince(搜索)

    题目链接 Problem Description Nowadays princess Claire wants one more guard and posts the ads throughout ...

最新文章

  1. Git单人本地仓库操作
  2. 图表示学习+图神经网络:破解AI黑盒,揭示万物奥秘的钥匙!
  3. HDU5709 : Claris Loves Painting
  4. Remove Duplicates from Sorted List 去除链表中重复值节点
  5. php编译自己库文件,php编译后追加库模块-gd库
  6. 敏捷 冲刺_在这个敏捷的假期季节给予技术债务冲刺的礼物
  7. QT5开发及实例学习之三字符串类
  8. android 分析boot.img,Android 系统准备知识-bootimg文件的结构
  9. 意超级杯尤文小胜AC米兰 C罗获转会后首个冠军
  10. 10-11-基数排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版
  11. linux编辑音频文件,Linux 上的最佳音频编辑工具推荐
  12. 再谈如何以最简单的方法将泛型为String类型的集合或String类型的数组转化为逗号间隔字符串形式
  13. 从零学Java目录导航
  14. 认识RAW修图基础知识
  15. js中英文字符与中文字符长度区别
  16. ECMASript 6 新特性
  17. 【IDEA保姆级教程】快捷键
  18. 剪映专业版 - 你的短视频剪辑小帮手!附Mac/Win地址!
  19. 23-基于51单片机土壤湿度检测及自动浇花系统(带时间显示)
  20. CSDN1024勋章获得方法

热门文章

  1. 0x80073712_win10 1709更新失败提示错误0x80073712怎么办
  2. 多表查询(连接查询)
  3. MyISAM与InnoDB存储引擎
  4. 2021年汽车半导体行业研究报告
  5. HTML和CSS隐藏元素的四种方法
  6. markdown文本居中,段首缩进的方法
  7. Java中的类、方法、属性的命名规则
  8. 西安交通大学第14周大计基
  9. MIUI12 for OnePlus 7T 使用钱包app 的尝试
  10. 【第25章】移动应用安全需求分析与安全保护工程(软考:信息安全工程师) -- 学习笔记