POJ 1904 King's Quest(强连通)
|
Language:
Default
King's Quest
Description
Once upon a time there lived a king and he had N sons. And there were N beautiful girls in the kingdom and the king knew about each of his sons which of those girls he did like. The sons of the king were young and light-headed, so it was possible for one son
to like several girls. So the king asked his wizard to find for each of his sons the girl he liked, so that he could marry her. And the king's wizard did it -- for each son the girl that he could marry was chosen, so that he liked this girl and, of course, each beautiful girl had to marry only one of the king's sons. However, the king looked at the list and said: "I like the list you have made, but I am not completely satisfied. For each son I would like to know all the girls that he can marry. Of course, after he marries any of those girls, for each other son you must still be able to choose the girl he likes to marry." The problem the king wanted the wizard to solve had become too hard for him. You must save wizard's head by solving this problem. Input
The first line of the input contains N -- the number of king's sons (1 <= N <= 2000). Next N lines for each of king's sons contain the list of the girls he likes: first Ki -- the number of those girls, and then Ki different integer numbers, ranging from 1 to
N denoting the girls. The sum of all Ki does not exceed 200000. The last line of the case contains the original list the wizard had made -- N different integer numbers: for each son the number of the girl he would marry in compliance with this list. It is guaranteed that the list is correct, that is, each son likes the girl he must marry according to this list. Output
Output N lines.For each king's son first print Li -- the number of different girls he likes and can marry so that after his marriage it is possible to marry each of the other king's sons. After that print Li different integer numbers denoting those girls, in
ascending order. Sample Input 4 Sample Output 2 1 2 Hint
This problem has huge input and output data,use scanf() and printf() instead of cin and cout to read data to avoid time limit exceed.
Source |
|||||||||
借鉴链接:http://blog.csdn.net/l04205613/article/details/6654820
题意是,N个男生和N个女生,告诉你每一个男生喜欢的女生编号,然后给出一个初始匹配(这个初始匹配是完备匹配),然后求全部可能的完备匹配,按升序输出。当然。假设暴整的话(当然我没试过)。2000个男生+2000个女生,最多有20W条有向边
看了一个神牛的报告,把这个转化成强连通问题:
首先依照给出的有向边建图,然后依据最后的那个完备匹配在图中增加反向边(就是依据那个完备匹配连 女生 到 男生 的边),那么在这个图中,属于同一个强连通的点对一定是合法点对。把他们排序输出就可以。
由于男生是不会爱男生的。所以假设是强连通,那么男生肯定是爱这个强连通分量中的全部女生的
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map> #define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1) #define eps 1e-8
typedef __int64 ll; #define fre(i,a,b) for(i = a; i <b; i++)
#define free(i,b,a) for(i = b; i >= a;i--)
#define mem(t, v) memset ((t) , v, sizeof(t))
#define ssf(n) scanf("%s", n)
#define sf(n) scanf("%d", &n)
#define sff(a,b) scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf printf
#define bug pf("Hi\n") using namespace std; #define INF 0x3f3f3f3f
#define N 20000 int ans[N],time_num,time[N],low[N],type[N],cnt;
int instack[N];
int n; vector<int>g[N];
stack<int>q; void tarjan(int x)
{
int i,j;
time[x]=low[x]=++time_num;
instack[x]=1;
q.push(x);
fre(i,0,g[x].size())
{
int to=g[x][i];
if(time[to]==0)
{
tarjan(to);
if(low[to]<low[x]) low[x]=low[to];
}
else
if(instack[to]&&low[x]>low[to])
low[x]=low[to];
}
int to;
if(time[x]==low[x])
{
cnt++; do{
to=q.top();
q.pop();
type[to]=cnt;
instack[to]=0; }while(to!=x);
}
} void solve()
{
int i,j;
mem(time,0);
mem(low,0);
mem(instack,0);
time_num=0; int k;
while(!q.empty()) q.pop(); mem(type,0);
cnt=0; fre(i,1,n*2+1)
if(time[i]==0)
tarjan(i); fre(i,1,n+1)
{
k=0;
fre(j,0,g[i].size())
if(type[i]==type[g[i][j]])
ans[k++]=g[i][j]-n; sort(ans,ans+k); pf("%d",k);
fre(j,0,k)
pf(" %d",ans[j]);
pf("\n");
} }
int main()
{
int i,j;
while(~sf(n))
{
fre(i,1,n+n+1)
g[i].clear(); int k,x;
fre(i,1,n+1)
{ sf(k);
while(k--)
{
sf(x);
g[i].push_back(n+x); //男生爱女生
}
} fre(i,1,n+1)
{
sf(x);
g[x+n].push_back(i); //女生爱男生,假设这一种爱的关系是一种强连通。那么男生都能够选里面的女生
}
solve();
}
return 0;
}
POJ 1904 King's Quest(强连通)的更多相关文章
- Poj 1904 King's Quest 强连通分量
题目链接: http://poj.org/problem?id=1904 题意: 有n个王子和n个公主,王子只能娶自己心仪的公主(一个王子可能会有多个心仪的公主),现已给出一个完美匹配,问每个王子都可 ...
- POJ 1904 King's Quest ★(强连通分量:可行完美匹配边)
题意 有n个女生和n个男生,给定一些关系表示男生喜欢女生(即两个人可以结婚),再给定一个初始匹配,表示这个男生和哪个女生结婚,初始匹配必定是合法的.求每个男生可以和哪几个女生可以结婚且能与所有人不发生 ...
- [poj 1904]King's Quest[Tarjan强连通分量]
题意:(当时没看懂...) N个王子和N个女孩, 每个王子喜欢若干女孩. 给出每个王子喜欢的女孩编号, 再给出一种王子和女孩的完美匹配. 求每个王子分别可以和那些女孩结婚可以满足最终每个王子都能找到一 ...
- POJ 1904 King's Quest (强连通分量+完美匹配)
<题目链接> 题目大意: 有n个王子,每个王子都有k个喜欢的妹子,每个王子只能和喜欢的妹子结婚,大臣给出一个匹配表,每个王子都和一个妹子结婚,但是国王不满意,他要求大臣给他另一个表,每个王 ...
- POJ - 1904 King's Quest (强连通)
题意:有N个王子,每个王子有任意个喜欢的妹子,巫师会给出一个方案:每个妹子都嫁给一个王子.但是国王希望知道:每个王子能在哪些妹子中择偶而不影响其他王子择偶. 分析:设王子为x部,妹子为y部,假设有匹配 ...
- POJ 1904 King's Quest 强连通分量+二分图增广判定
http://www.cnblogs.com/zxndgv/archive/2011/08/06/2129333.html 这位神说的很好 #include <iostream> #inc ...
- 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 ...
- poj 1904 King's Quest
King's Quest 题意:有N个王子和N个妹子;(1 <= N <= 2000)第i个王子喜欢Ki个妹子:(详见sample)题给一个完美匹配,即每一个王子和喜欢的一个妹子结婚:问每 ...
- POJ 1904 King's Quest(SCC的巧妙应用,思维题!!!,经典题)
King's Quest Time Limit: 15000MS Memory Limit: 65536K Total Submissions: 10305 Accepted: 3798 Ca ...
随机推荐
- oracle字符串载取及判断是否包含指定字符串
oracle 截取字符(substr),检索字符位置(instr) case when then else end语句使用 收藏 常用函数:substr和instr1.SUBSTR(string,st ...
- C#高级编程9-第13章 异步编程
异步编程 1)异步编程的重要性 在C#5.0中提供了关键字:async和await 使用异步编程后台运行方法调用,程序的运行过程中就不会一直处于等待中.便于用户继续操作. 异步编程有3种模式:异步模式 ...
- 使用Quartz搭建定时任务脚手架
定时任务的实现有很多种,在Spring项目中使用一个注解 @Scheduled就可以很快搞定. 但是很难去管理项目中的定时任务,比如说:系统中有多少定时任务,每个定时任务执行规则,修改执行规则,暂停任 ...
- Shell Step by Step (4) —— Cron & Echo
6.脚本定时任务 # Example of job definition: # .------------------------- minute (0 - 59) # | .------------ ...
- linux 启动 Oracle 实例
启动数据库实例,分为两步:第一步,启动监听:第二步,启动数据库实例. 一.如何启动数据库实例 1.进入到sqlplus启动实例 --“切换到oracle用户” su - oracle --“打开监听” ...
- 如何用C#动态编译、执行代码
在开始之前,先熟悉几个类及部分属性.方法:CSharpCodeProvider.ICodeCompiler.CompilerParameters.CompilerResults.Assembly. 一 ...
- javascript删除数组,索引出现问题解决办法。
var data = [ { isRemove: 0, name: "项目1" }, { isRemove: 1, name: "项目2" }, { isRem ...
- WPF Dispatcher介绍
微软在WPF引入了Dispatcher,那么这个Dispatcher的主要作用是什么呢?Dispatcher的作用是用于管理线程工作项队列.主线程负责接收输入.处理事件.绘制屏幕等工作,这样一来,UI ...
- MySql之触发器的使用
一:触发器的使用场景 当数据库的记录发生变化时,自动触发某些操作. MySQL的触发器响应三种操作,六种场合: 三种操作:DELETE.INSERT.UPDATE. 六种场合:三种操作的BEFORE. ...
- ISO镜像安装Ubuntu 13.04 64位,启动菜单制作
1.将光盘镜像中的vmlinuz.efi.initrd.lz,和镜像本身(ubuntu....iso) 三个文件复制到U盘根目录下.如果下面的方法没成功启动,你可能要把U盘格式化为USB-HDD FA ...