POJ 1904 King's Quest (强连通分量+完美匹配)

时间:2022-12-24 03:23:22

<题目链接>

题目大意:

  有n个王子,每个王子都有k个喜欢的妹子,每个王子只能和喜欢的妹子结婚,大臣给出一个匹配表,每个王子都和一个妹子结婚,但是国王不满意,他要求大臣给他另一个表,每个王子可以和几个妹子结婚,按序号升序输出妹子的编号,这个表应满足所有的王子最终都有妹子和他结婚。

解题分析:  <转载于 >>> >

  如果王子u喜欢妹子v,则建一条边u指向v(u,v),对于大臣给出的初始完美匹配,如果王子u和妹子v结婚,则建一条边v指向u(v,u),然后求强连通分量。对于每个王子和妹子,如果他们都在同一个强连通分量内,则他们可以结婚。

  为什么呢?因为每个王子只能和喜欢的妹子结婚,初始完美匹配中的丈夫和妻子之间有两条方向不同的边可以互达,则同一个强连通分量中的王子数和妹子数一定是相等的,若王子 x 可以和另外的一个妹子 a 结婚,妹子 a 的原配王子 y 肯定能找到另外一个妹子 b 结婚,因为如果找不到的话,则 x 和 a 必不在同一个强连通分量中。

所以一个王子可以和所有与他同一强连通分量的妹子结婚,而这不会导致同一强连通分量中的其他王子找不到妹子结婚。

(证明:王子为什么不能选择不同强连通分量的妹子:

  反证法:如果强连通分量 1 中的王子选择了强连通分量 2 中的妹子,那么势必强连通分量 2 中的一个王子无法在自己的强连通分量中找到妹子,那么他就会去别的强连通分量找妹子,这样一直循环下去,我们知道最终一定是经过了强连通分量 1,2,x1,x2,xn,……,1,王子们才能都找到自己的妹子,这样这些强连通分量1,2,x1,x2,xn,……,1会构成一个强连通分量,与题设在不同强连通分量中找妹子不符)。

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std; #define clr(a, b) memset(a, b, sizeof(a))
const int N = 5e3 + ; int n, tot, scc, top;
int stk[N], dfn[N], low[N], belong[N], instack[N], ans[N];
vector<vector<int> > G;
void init() {
tot = scc = top = ;
clr(dfn, );clr(stk, );clr(low, );clr(belong, );clr(instack, );
G.clear(), G.resize(N);
}
void Tarjan(int u) {
low[u] = dfn[u] = ++tot;
stk[++top] = u;
instack[u] = ;
int v;
for (int i = ; i < G[u].size(); i++) {
v = G[u][i];
if (!dfn[v]) {
Tarjan(v);
low[u] = min(low[u], low[v]);
} else if (instack[v]) low[u] = min(low[u], dfn[v]);
}
if (low[u] == dfn[u]) {
++scc;
do {
v = stk[top--];
instack[v] = ;
belong[v] = scc; //将该强连通块缩点染色
} while (v != u);
}
}
int main() {
while (scanf("%d", &n) != EOF) {
init();
int k, x;
for (int i = ; i <= n; i++) {
scanf("%d", &k);
while (k--) {
scanf("%d", &x);
G[i].push_back(x + n); //王子编号为1~n,公主编号为n+1~2*n
}
}
for (int i = ; i <= n; i++) {
scanf("%d", &x);
G[x + n].push_back(i); //根据该完美匹配,让公主与对应的王子连边
}
for (int i = ; i <= n; i++) if (!dfn[i]) Tarjan(i);
for (int i = ; i <= n; i++) {
int u = belong[i], v;
clr(ans, ); // ans[]存所有能够与当前王子进行配对的公主
int cur = ;
for (int j = ; j < G[i].size(); j++) { //找出当前王子所在联通块的公主数量
v = belong[G[i][j]];
if (u == v) ans[cur++] = G[i][j];
}
sort(ans, ans + cur);
printf("%d ", cur);
for (int i = ; i < cur; i++) {
printf("%d%s", ans[i] - n, i == cur - ? "\n" : " ");
}
}
}
}

POJ 1904 King's Quest (强连通分量+完美匹配)的更多相关文章

  1. POJ 1904 King's Quest &starf;&lpar;强连通分量:可行完美匹配边&rpar;

    题意 有n个女生和n个男生,给定一些关系表示男生喜欢女生(即两个人可以结婚),再给定一个初始匹配,表示这个男生和哪个女生结婚,初始匹配必定是合法的.求每个男生可以和哪几个女生可以结婚且能与所有人不发生 ...

  2. Poj 1904 King&&num;39&semi;s Quest 强连通分量

    题目链接: http://poj.org/problem?id=1904 题意: 有n个王子和n个公主,王子只能娶自己心仪的公主(一个王子可能会有多个心仪的公主),现已给出一个完美匹配,问每个王子都可 ...

  3. POJ 1904 King&&num;39&semi;s Quest 强连通分量&plus;二分图增广判定

    http://www.cnblogs.com/zxndgv/archive/2011/08/06/2129333.html 这位神说的很好 #include <iostream> #inc ...

  4. POJ - 1904 King&&num;39&semi;s Quest &lpar;强连通&rpar;

    题意:有N个王子,每个王子有任意个喜欢的妹子,巫师会给出一个方案:每个妹子都嫁给一个王子.但是国王希望知道:每个王子能在哪些妹子中择偶而不影响其他王子择偶. 分析:设王子为x部,妹子为y部,假设有匹配 ...

  5. &lbrack;poj 1904&rsqb;King&&num;39&semi;s Quest&lbrack;Tarjan强连通分量&rsqb;

    题意:(当时没看懂...) N个王子和N个女孩, 每个王子喜欢若干女孩. 给出每个王子喜欢的女孩编号, 再给出一种王子和女孩的完美匹配. 求每个王子分别可以和那些女孩结婚可以满足最终每个王子都能找到一 ...

  6. poj 1904&lpar;强连通分量&plus;完美匹配&rpar;

    传送门:Problem 1904 https://www.cnblogs.com/violet-acmer/p/9739990.html 参考资料: [1]:http://www.cnblogs.co ...

  7. poj 1904 King&&num;39&semi;s Quest

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

  8. POJ 1904 King&&num;39&semi;s Quest tarjan

    King's Quest 题目连接: http://poj.org/problem?id=1904 Description Once upon a time there lived a king an ...

  9. POJ 1904 King&&num;39&semi;s Quest&lpar;SCC的巧妙应用,思维题!!!,经典题)

    King's Quest Time Limit: 15000MS   Memory Limit: 65536K Total Submissions: 10305   Accepted: 3798 Ca ...

随机推荐

  1. TNS-12518 &amp&semi; Linux Error:32:Broken pipe

    最近一周,有一台ORACLE数据库服务器的监听服务在凌晨2点过几分的时间点突然崩溃,以前从没有出现过此类情况,但是最近一周出现了两次这种情况,检查时发现了如下一些信息: $ lsnrctl servi ...

  2. istringstream、ostringstream、stringstream 类简介

    本文系转载,原文链接:http://www.cnblogs.com/gamesky/archive/2013/01/09/2852356.html ,如有侵权,请联系我:534624117@qq.co ...

  3. tomcat session cluster

    Session的生命周期 以前在学习的时候没怎么注意,今天又回过头来仔细研究研究了一下Session的生命周期. Session存储在服务器端,一般为了防止在服务器的内存中(为了高速存取),Sessi ...

  4. ipad横竖屏尺寸&lpar;转载&rpar;

    iPad在横屏模式下,界面区域元素主要由下图所示构成: 横屏主要尺寸:宽度:1024px高度:768px状态栏(Status Bar)高度:20px导航条(Nav Bar)高度:44px主内容区域(M ...

  5. Qt移植 Window --Linux

    1.把源代码复制到Linux目录,使用qmake命令,注意在shell中直接使用qmake命令注意设置PATH环境变量 2. 在目录中会生成Makeflie文件 3. make即可 /usr/bin/ ...

  6. To fix sql server 2008 r2 Evaluation period has expired by change the key

    PTTFM-X467G-P7RH2-3Q6CG-4DMYB 数据中心版:PTTFM-X467G-P7RH2-3Q6CG-4DMYB   测试可用 开 发者 版:MC46H-JQR3C-2JRHY-XY ...

  7. 检测 IE 版本 in Javascript

    点击打开链接http://*.com/questions/10964966/detect-ie-version-in-javascript <!doctype html& ...

  8. 关于IM的一些思考与实践

    上一篇简单的实现了一个聊天网页,但这个太简单,消息全广播,没有用户认证和已读未读处理,主要的意义是走通了websocket-sharp做服务端的可能性.那么一个完整的IM还需要实现哪些部分? 一.发消 ...

  9. fastcgi 环境变量例子

    例如请求的url http://172.28.250.184:8099/aa.php?var=ccccc&value=bbbbbb 前两个字节分别代表  变量名长度  和 变量值长度. 0x0 ...

  10. Apache Spark探秘:利用Intellij IDEA构建开发环境

    1)准备工作 1)  安装JDK 6或者JDK 7      或者JDK8  mac 的  参看http://docs.oracle.com/javase/8/docs/technotes/guide ...