King's Quest---poj1904(连通图缩点)
题目链接:http://poj.org/problem?id=1904
题意:国王有n个儿子,每个儿子喜欢ki个女孩,国王想让王子与他喜欢的人结婚,就让巫师做一个列表出来,但是国王想知道王子能和哪些女孩结婚,并且不影响其他王子也能与自己喜欢的女孩在一起;
其实就是求王子能和哪些女孩结婚,不影响最大匹配;
假如已知匹配王子属于x,女孩属于y
现有匹配xi---yi xj---yj 并且xi也喜欢yj
如果说xi能和yj匹配并不改变匹配总数,必须满足一下两个条件之一:
1:xj也喜欢yi;
2:yi 被某个匹配中的 xk喜欢,并且 xi 也喜欢 yk ;
思路很像匈牙利算法中找曾广路的过程;xi--->yj--->xk--->yi--->xi(是一个环,各点都能相互到达,所以其中的匹配可以互换,并且不影响匹配总数);
建图:王子u喜欢女孩v,则u到v连一条边。对于给出的初始完美匹配,王子u与女孩v匹配,则v到u连一条边。然后求SCC。
显然对于同一个SCC中王子数目和女孩数目是相等的,并且从某个王子出发能够到达所有女孩,这样,王子可以和属于同一个SCC中的任意一个女孩结婚,而不会影响其他王子。
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
#define met(a, b) memset(a, b, sizeof(a))
const int N = ; int n, low[N], dfn[N], Time;
int IsSta[N], Sta[N], top, Belong[N], cnt, ans[N];
vector<vector<int> >G; void Init()
{
met(low, );
met(dfn, );
met(IsSta, );
met(Sta, );
met(Belong, );
G.clear();
G.resize(N+);
Time = cnt = top = ;
} void Tarjan(int u)
{
low[u] = dfn[u] = ++ Time;
IsSta[u] = ;
Sta[top++] = u;
int len = G[u].size(), v;
for(int i=; i<len; i++)
{
v = G[u][i];
if(!dfn[v])
{
Tarjan(v);
low[u] = min(low[u], low[v]);
}
else if(IsSta[v])
low[u] = min(low[u], dfn[v]);
}
if(low[u] == dfn[u])
{
++ cnt;
do
{
v = Sta[--top];
IsSta[v] = ;
Belong[v] = cnt;
}while(u != v);
}
} int main()
{
while(scanf("%d", &n) != EOF)
{
Init(); int k, x; for(int i=; i<=n; i++)
{
scanf("%d", &k);
for(int j=; j<=k; j++)
{
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 len = G[i].size(), u = Belong[i], v; met(ans, );
int K = ; for(int j=; j<len; j++)
{
v = Belong[ G[i][j] ];
if( u == v )///当他们在一个块中时是可以与之匹配的;
ans[K++] = G[i][j];
} sort(ans, ans+K); printf("%d", K);
for(int j=; j<K; j++)
printf(" %d", ans[j]-n);///恢复原编号;
printf("\n");
}
}
return ;
}
King's Quest---poj1904(连通图缩点)的更多相关文章
- King's Quest —— POJ1904(ZOJ2470)Tarjan缩点
King's Quest Time Limit: 15000MS Memory Limit: 65536K Case Time Limit: 2000MS Description Once upon ...
- UVA1327 && POJ1904 King's Quest(tarjan+巧妙建图+强连通分量+缩点)
UVA1327 King's Quest POJ1904 King's Quest 题意: 有n个王子,每个王子都有k个喜欢的妹子,每个王子只能和喜欢的妹子结婚.现有一个匹配表,将每个王子都与一个自己 ...
- POJ1904:King's Quest(强连通+思维)
King's Quest Time Limit: 15000MS Memory Limit: 65536K Total Submissions: 10352 Accepted: 3815 题目 ...
- POJ1904 King's Quest
King's Quest Language:Default King's Quest Time Limit: 15000MS Memory Limit: 65536K Total Submission ...
- poj 1904 King's Quest
King's Quest 题意:有N个王子和N个妹子;(1 <= N <= 2000)第i个王子喜欢Ki个妹子:(详见sample)题给一个完美匹配,即每一个王子和喜欢的一个妹子结婚:问每 ...
- POJ1904(有向图缩点+输入输出挂参考)
King's Quest Time Limit: 15000MS Memory Limit: 65536K Total Submissions: 8311 Accepted: 3017 Cas ...
- POJ 1904 King's Quest(SCC的巧妙应用,思维题!!!,经典题)
King's Quest Time Limit: 15000MS Memory Limit: 65536K Total Submissions: 10305 Accepted: 3798 Ca ...
- POJ 1904 King's Quest tarjan
King's Quest 题目连接: http://poj.org/problem?id=1904 Description Once upon a time there lived a king an ...
- King's Quest POJ - 1904 匈牙利算法的思想+tarjan缩点+染色
题目链接:https://cn.vjudge.net/problem/POJ-1904 自己一开始的想法,打算用匈牙利算法实现,找二分图的最大匹配.但是打了打发现,不太好实现.原因如下:匈牙利算法是不 ...
随机推荐
- 旺店通erp系统
http://www.wangdian.cn/ api 文档:https://wenku.baidu.com/view/cd0d21ffbd64783e08122b80.html
- 32位win7+vs2008编译mysql 5.6.22源码并安装
以下这部分安装说明是来自http://www.2cto.com/database/201407/316681.html的win7+vs2010源码编译mysql,文章最后会说明用vs2008编译遇见的 ...
- win10找回Windows照片查看器
- 《转载》Tomcat内存设置详解
原文地址:Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 ...
- Android 之 布局训练
1.线性布局 LinearLayout <?xml version="1.0" encoding="utf-8"?> <LinearLay ...
- 【MySQL】 Cannot load from mysql.proc. The table is probably corrupted
解决办法 在 mysql 这张表里边.执行sql ALTER TABLE `proc` MODIFY COLUMN `comment` text CHARACTER SET utf8 COLLATE ...
- springboot---->springboot中的格式化(一)
这里面我们简单的学习一下springboot中关于数据格式化的使用.我以为你不是个好人,没想到你连个坏人都不是. springboot中的格式化 我们的测试环境是springboot,一个将字符串格式 ...
- 使用 CSS MARK 改变 SVG 背景色
CSS masks -webkit-mask 这个属性是相当强大的,详细的介绍请到这里查看,它非常值得深入研究. -webkit-mask 让为一个元素添加蒙板成为可能,从而你可以创建任意形状的花样. ...
- 流程图 --- BPMN规范简介
BPMN 目前 是2.0规范 http://www.bpmn.org/ BPMN Quick Guide http://blog.csdn.net/flygoa/article/details/5 ...
- 让人一看就懂的excel相对引用和绝对引用案例解析
http://www.ittribalwo.com/article/2831.html 内容提要:本文的excel相对引用和绝对引用.混合引用的使用方法案例截选自<Excel效率手册 早做完,不 ...