题目链接: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(连通图缩点)的更多相关文章

  1. King's Quest —— POJ1904(ZOJ2470)Tarjan缩点

    King's Quest Time Limit: 15000MS Memory Limit: 65536K Case Time Limit: 2000MS Description Once upon ...

  2. UVA1327 && POJ1904 King's Quest(tarjan+巧妙建图+强连通分量+缩点)

    UVA1327 King's Quest POJ1904 King's Quest 题意: 有n个王子,每个王子都有k个喜欢的妹子,每个王子只能和喜欢的妹子结婚.现有一个匹配表,将每个王子都与一个自己 ...

  3. POJ1904:King's Quest(强连通+思维)

    King's Quest Time Limit: 15000MS   Memory Limit: 65536K Total Submissions: 10352   Accepted: 3815 题目 ...

  4. POJ1904 King's Quest

    King's Quest Language:Default King's Quest Time Limit: 15000MS Memory Limit: 65536K Total Submission ...

  5. poj 1904 King's Quest

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

  6. POJ1904(有向图缩点+输入输出挂参考)

    King's Quest Time Limit: 15000MS   Memory Limit: 65536K Total Submissions: 8311   Accepted: 3017 Cas ...

  7. POJ 1904 King's Quest(SCC的巧妙应用,思维题!!!,经典题)

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

  8. 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 ...

  9. King's Quest POJ - 1904 匈牙利算法的思想+tarjan缩点+染色

    题目链接:https://cn.vjudge.net/problem/POJ-1904 自己一开始的想法,打算用匈牙利算法实现,找二分图的最大匹配.但是打了打发现,不太好实现.原因如下:匈牙利算法是不 ...

随机推荐

  1. Splash wait() 方法

    wait()方法用于控制页面的等待时间,如下,实现访问淘宝并等待2秒,随后返回淘宝页面的源代码: function main(splash) splash:go("https://www.t ...

  2. YII2 model 字段验证提示 Unknown scenario: update

    意思是 update 场景不存在,也就是 定义的 rules 中没有该规则: /** * @inheritdoc * 验证规则 */ public function rules() { return ...

  3. 微信小程序插件内页面跳转和参数传递(转)

    在此以插件开发中文章列表跳传文章详情为例. 1.首先在插件中的文章列表页面wxml中绑定跳转事件. bindtap='url' data-id="{{item.article_id}}&qu ...

  4. 题目1448:Legal or Not(有向无环图判断——拓扑排序问题)

    题目链接:http://ac.jobdu.com/problem.php?pid=1448 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...

  5. 九度OJ小结

    1. 高精度问题 可参考题目 题目1137:浮点数加法   http://ac.jobdu.com/problem.php?pid=1137 对于高精度问题可以考虑使用结构体.上述为浮点数加法,因此该 ...

  6. loop设备及losetup命令

    1. loop设备介绍 在类 UNIX 系统里,loop 设备是一种伪设备(pseudo-device),或者也可以说是仿真设备.它能使我们像块设备一样访问一个文件.在使用之前,一个 loop 设备必 ...

  7. C语言位操作--奇偶校验算法

    信息是以比特流的方式传输的,类似01000001.在传输过程中,有可能会发生错误,比如,我们存储了01000001,但是取出来却是01000000,即低位由0变成了1.为了检测到这种错误,我们可以通过 ...

  8. 解决方案:CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\--”--“拒绝访问。 ”

    IIS部署的网站打开出现问题: CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET F ...

  9. shell脚本中对简单实现对log的处理

    用shell在写小程序时,log没用像python样用logging模块可以直接使用,下面我们就简单写下用shell函数来实现log分级 #/bin/bash sys_log="/var/l ...

  10. Unity3D笔记十九 持久化数据

    1.PlayerPrefs类(生命周期???) 1.1 保存与读取数据 在C#中类似缓存.Cookie.Session等保存数据的,但是有点区别的是在C#中如果在取值时没有取到默认值则返回值是NULL ...