让我们首先来考虑建图
如果王子u喜欢妹子v那我们可以从u向v连一条有向边
如果妹子v可以与王子u配对(即在配对表上),那我们可以从v向u连一条有向边
对于样例

如果王子和另一个姑娘在同一个连通分量上,说明可以娶。
因为同一个强连通分量种都有相同数量的姑娘和王子,王子在找别的姑娘的同时,他的原配姑娘也能被在同一个连通分量的另一个王子找到。

巫师给出的列表就是一个完备匹配(每一个人都有且只有一个匹配),我们要从这个完备匹配中选择答案

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;const int N= 500007, M = 5000007;
int n, m;
int dfn[N], low[N], num;
int ans[N];
int cnt;
int head[N], ver[M], nex[M], tot;
int stk[N], top;
int scc_cnt;
int scc_id[N];void add(int x, int y)
{ver[tot] = y;nex[tot] = head[x];head[x] = tot ++ ;
}bool ins[N];void tarjan(int x)
{dfn[x] = low[x] = ++ num;stk[++ top] = x;ins[x] = true;for(int i = head[x] ;~i; i = nex[i]){int y = ver[i];if(!dfn[y]){tarjan(y);low[x] = min(low[x], low[y]);}else if(ins[y])low[x] = min(low[x], dfn[y]);}if(dfn[x] == low[x]){int y;++ scc_cnt;do{y = stk[top -- ];ins[y] = false;scc_id[y] = scc_cnt;}while(x != y);}
}int main()
{while(~scanf("%d", &n)){scc_cnt = tot = num = 0;memset(head, -1, sizeof head);memset(dfn, 0, sizeof dfn);memset(low, 0, sizeof low);memset(scc_id, 0, sizeof scc_id);for(int i = 1; i<= n; ++i){int x;scanf("%d", &x);for(int j = 1; j <= x; ++ j){int y;scanf("%d", &y);add(i, y + n);}}int x;for(int i = 1; i <= n; ++ i)scanf("%d", &x), add(x + n, i);for(int i = 1; i <= n; ++i)if(!dfn[i])tarjan(i);for(int x = 1; x <= n; ++ x){cnt = 0;for(int i = head[x]; ~i; i = nex[i]){int y = ver[i];if(scc_id[x] == scc_id[y])ans[ ++ cnt] = y - n;}sort(ans + 1, ans + 1 + cnt);printf("%d ", cnt);for(int j = 1 ; j <= cnt; ++ j)printf("%d%s", ans[j], j == cnt ? "\n" : " ");}}return 0;
}

UVA1327 King‘s Quest(强连通分量、给王子们匹配公主系列 - 1 )相关推荐

  1. poj 1904 King's Quest 强连通分量+匹配

    ========== 题目链接King's Quest ============ 题解:通过原有的完美匹配,反向建边,在同一个强连通分量里面的王子和公主可以匹配,而不影响其他王子的结婚对象. //#i ...

  2. POJ - 1904 King's Quest 强连通tanjar思想

    传送门 题意:每个儿子都喜欢许多女孩,问每个渣男儿子最多有几个可以选择备胎.他爹也挺渣.. 猛地一看,哇二分匹配,但是想了想输入输出都能卡时间的题目,循环暴力二分匹配必T无疑,在做强连通模块的题所以想 ...

  3. HDU 3861 The King’s Problem 强连通分量 最小路径覆盖

    先找出强连通分量缩点,然后就是最小路径覆盖. 构造一个二分图,把每个点\(i\)拆成两个点\(X_i,Y_i\). 对于原图中的边\(u \to v\),在二分图添加一条边\(X_u \to Y_v\ ...

  4. POJ - 1904 King's Quest(强连通缩点)

    题目链接:点击查看 题目大意:给出n个王子和n个公主,每个王子都有喜欢的公主,每个王子初始时都娶到了一位喜欢的公主,题目需要我们求出每个王子所能娶的所有公主,必须保证王子娶了其中任何一个之后,其他的王 ...

  5. POJ 1904 King's Quest(强连通分量)

    题目链接 Description Once upon a time there lived a king and he had N sons. And there were N beautiful g ...

  6. POJ 1904 【强连通分量】.cpp

    题意: 很久很久以前.. 有一个国王.. 他有好几个儿子.. 这些王子都喜欢上了邻国的公主.. 他们准备迎娶自己喜欢的公主中的一个.. 国王就让宰相给列一个清单.. 宰相就给了国王一个清单..上面写明 ...

  7. POJ2186 Popular Cows【Tarjan】【强连通分量】

    题目连接: http://poj.org/problem?id=2186 题目大意: 每头奶牛都希望自己成为最欢迎的那头牛.给你N头牛,M个崇拜关系(A,B).意思是牛A 崇拜牛B.特别是,如果牛A崇 ...

  8. The King’s Problem(tarjan求强连通分量缩点+匈牙利求有向无环图的最小路径覆盖)

    Link:http://acm.hdu.edu.cn/showproblem.php?pid=3861 The King's Problem Time Limit: 2000/1000 MS (Jav ...

  9. poj 1904 King's Quest

    King's Quest 题意:有N个王子和N个妹子;(1 <= N <= 2000)第i个王子喜欢Ki个妹子:(详见sample)题给一个完美匹配,即每一个王子和喜欢的一个妹子结婚:问每 ...

最新文章

  1. UA OPTI512R 傅立叶光学导论12 傅立叶级数基础
  2. Android中利用服务来守护进程
  3. 图像降噪算法——小波硬阈值滤波(上)
  4. 大连公交客运集团认真安排做好2007年防台防汛准备工作
  5. 控件onkeyup事件,使验证控件不能即时验证
  6. jsp的九大内置对象和四大作用域
  7. Web开发静态资源处理---SpringBoot
  8. ElasticSearch启动报错at least one of [discovery.seed_hosts, discovery.seed_provid---ElasticSearch工作笔记032
  9. 文件怎么更新_iOS13屏蔽更新描述文件失效了怎么办?iOS13屏蔽系统更新教程
  10. 高德地图怎么搜索marker_百度、高德、腾讯地图坐标认证怎么弄,3分钟轻松自助认证...
  11. angular发布代码有缓存_[译文]RxJS缓存进阶
  12. Siemens NX 1930中文版
  13. html 取色器插件,jQuery拾色器插件bigcolorpicker
  14. 手把手 网络爬虫:用爬虫爬取贝壳房租网西安的租房信息
  15. 小型计算机和Pc,超小型台式电脑:重量相当于两个新iPhone
  16. jq 获取input的光标,定位光标的位置
  17. B站 bilibili 视频、分区、up主数据合集
  18. Speedoffice 两个方法教你如何在Word文档中划线
  19. 什么是后端?后台?别傻傻的分不清
  20. 修改CMD窗口 使其翻阅之前的内容

热门文章

  1. 编写同时在PyTorch和Tensorflow上工作的代码
  2. L-SNET:从区域定位到尺度不变的医学图像分割
  3. 邮件客户端WebMail Pro v7.7.5发布,在线订购限时75折优惠!
  4. C#使用 SharpSSH
  5. mac上使用crontab周期性执行python脚本
  6. git常见操作--忽略文件以及常用命令【转】
  7. NSNotification先注册监听,再发送消息
  8. 分享一个监控MFS的nagios插件
  9. VC6.0制作OCX并web调用 .
  10. linux sed命令处理文本文件