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 自己一开始的想法,打算用匈牙利算法实现,找二分图的最大匹配.但是打了打发现,不太好实现.原因如下:匈牙利算法是不 ...
随机推荐
- Android涉及到的网址都记录在这把~~~~
http://source.android.com/source/initializing.html 开放源码 http://developer.android.com/about/versions ...
- JavaWeb学习总结(十五)Jsp中提交的表单的get和post的两种方式
两者的比较: Get方式: 将请求的参数名和值转换成字符串,并附加在原来的URL之后,不安全 传输的数据量较小,一般不能大于2KB: post方式: 数量较大: 请求的参数和值放在HTML的请求头中, ...
- java web当中表单提交到后台出现乱码的解决方法
1.如果提交方式为post,想不乱码,只需要在服务器端设置request对象的编码即可,客户端以哪种编码提交的,服务器端的request对象就以对应的编码接收,比如客户端是以UTF-8编码提交的,那么 ...
- Java EE发展史
前言 最近的这段时间一直在学习Java EE,刚刚完成了从0到1的蜕变,所以顺便整理一下我所了解到的Java EE,给刚入门学习的新人一些头绪,而所谓“启示录”,就是这个意思. 一.Java EE是什 ...
- 在apache虚拟目录配置
在apache虚拟目录配置中 <VirtualHost *:80>xxx xxx xxx</VirtualHost> 不能写成 <VirtualHost *>xxx ...
- 《转》Python学习(17)-python函数基础部分
http://www.cnblogs.com/BeginMan/p/3171977.html 一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/arch ...
- IOS设计模式第八篇之键值观察模式
版权声明:原创作品,谢绝转载!否则将追究法律责任. 键值观察模式: 在KVO,一个对象可以要求被通知当他的某个特殊的属性被改变了.自己或者另一个对象.如果你感兴趣你可以阅读更多的信息参考: Apple ...
- Matlab PCA 算法
Matlab 自带PCA函数形式为 [mappedX, mapping] = pca(X, no_dims) 自己编写PCA函数的步骤 %第一步:输入样本矩阵%%%%%%%%%%%%%%%%%%%%% ...
- 四、K3 WISE 开发插件《工业单据老单插件开发新手指导》
开发环境:K/3 Wise 13.0.K/3 Bos开发平台.Visual Basic 6.0 =============================================== 目录 一 ...
- js阻止浏览器的默认行为以及停止事件冒泡(用JQuery实现回车提交,兼容IE、FF浏览器) 转
1.阻止浏览器的默认行为 function stopDefault(e) { //如果提供了事件对象,则这是一个非IE浏览器 if(e && e.preventDefault) { / ...