【建模+强连通分量】POJ1904 King's Quest

Description

一个国王有n个王子,同时有n个女孩。每个王子都有自己喜欢的若干个女孩,现给定一个合法的完备匹配(也就是一个王子娶其中一个自己喜欢女孩),求每个王子可以选择哪些女孩可以让剩下的每个王子依旧能够选择到自己喜欢的一个女孩。

Solution

对于给定的排列,我们设ai为男a对应的女生,bi为女b对应的男生。

男i可以选哪些女生?选ai显然是可以的,如果没有选ai而选的x,那么会造成两个影响,x有两个a和bx选,ai没有人选。

所以需要让bx选新的女生,如果bx能选到ai,那么问题就解决了,否则bx就只能选一个y,让by继续选...直到能选到ai。若总走不到ai,则x不能被选。

这也就是说,从x能走到ai,如果我们这样建图,所有男向喜欢的女连一条边,根据给定匹配由女向男连边,那么i可以选x,也就是x可以到i。

因为i喜欢x,i定可到x,于是他们必在一个强连通分量中。

得到具体做法,按照上述建图,如果x和i在一个强连通分量,且i喜欢x,x就可以选i,问题解决。

Code

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn=2005;
 5
 6 int pre[maxn*2],low[maxn*2],clock;
 7 int scc[maxn*2],cnt,s[maxn*2],c;
 8 int G[maxn][maxn];
 9 int head[maxn*2],e[maxn*maxn],nxt[maxn*maxn],k;
10 int adde(int u,int v){
11     e[++k]=v;nxt[k]=head[u];head[u]=k;
12 }
13 int n;
14
15 int dfs(int u){
16     pre[u]=low[u]=++clock;
17     s[++c]=u;
18     for(int i=head[u];i;i=nxt[i]){
19         int v=e[i];
20         if(!pre[v]){
21             dfs(v);
22             low[u]=min(low[v],low[u]);
23         }
24         if(!scc[v]){
25             low[u]=min(pre[v],low[u]);
26         }
27     }
28     if(pre[u]==low[u]){
29         cnt++;
30         while(c){
31             scc[s[c]]=cnt;
32             if(s[c--]==u) break;
33         }
34     }
35 }
36
37 int main(){
38     int x,t;
39     scanf("%d",&n);
40     for(int i=1;i<=n;i++){
41         scanf("%d",&t);
42         for(int j=1;j<=t;j++){
43             scanf("%d",&x);
44             adde(i,x+n);
45             G[i][x]=1;
46         }
47     }
48     for(int i=1;i<=n;i++){
49         scanf("%d",&x);
50         adde(x+n,i);
51     }
52
53     for(int i=1;i<=2*n;i++)
54         if(!pre[i]) dfs(i);
55
56     for(int i=1;i<=n;i++){
57         int tot=0;
58         for(int j=n+1;j<=2*n;j++)
59             if(G[i][j-n]&&scc[i]==scc[j]) tot++;
60         printf("%d ",tot);
61         for(int j=n+1;j<=2*n;j++)
62             if(G[i][j-n]&&scc[i]==scc[j]) printf("%d ",j-n);
63         printf("\n");
64     }
65     return 0;
66 }

【建模+强连通分量】POJ1904 King's Quest

时间: 2024-10-09 03:28:30

【建模+强连通分量】POJ1904 King's Quest的相关文章

POJ1904 King&#39;s Quest(完备匹配可行边:强连通分量)

题目大概就是说给一张二分图以及它的一个完备匹配,现在问X部的各个点可以与Y部那些些点匹配,使得X部其余点都能找到完备匹配. 枚举然后匹配,当然不行,会超时. 这题的解法是,在二分图基础上建一个有向图:原二分图中边(x,y)连<x,y>的弧,对于那个已知的匹配中的所有边(x,y)连<y,x>的弧,然后对于X部各个点x如果它到Y部的y点有直接的边且它们在同一个强连通分量,那么x就能和y匹配. 我对这个解法的理解是这样的,类似于匈牙利算法的增广路: 如果x和y就属于给定的那个完备匹配那它

【连通图|二分匹配+强连通分量】POJ-1904 King&#39;s Quest

King's Quest Time Limit: 15000MS Memory Limit: 65536K Case Time Limit: 2000MS 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 g

Poj 1904 King&#39;s Quest 强连通分量

题目链接: http://poj.org/problem?id=1904 题意: 有n个王子和n个公主,王子只能娶自己心仪的公主(一个王子可能会有多个心仪的公主),现已给出一个完美匹配,问每个王子都可以取哪些公主,并且保证取了一个公主后,全局还是存在完美匹配. 题解: 1.建图: 如果王子u对公主v心仪,则连一条边u->v.在样例给出的那组完美匹配中,如果王子u娶了公主v,连一条边v->u. 2.求强连通分量: 如果王子和自己心仪的公主属于同一个强连通分量,那么王子就可以娶这个公主. 1 #i

POJ - 1904 King&#39;s Quest(强连通分量+二分图匹配)

题目大意:有N个帅哥和N个美女,现在给出每个帅哥所喜欢的美女的编号,和一个帅哥和美女的完美匹配 问每个帅哥可以娶多少个美女,且当他娶完这个美女后,剩下的人还可以完美匹配 解题思路:神题啊,给一个大神的详细解答 具体是这样的,首先先建边,把帅哥和能娶到的美女连边,再把完美匹配的美女和帅哥连边,这样就形成了一张有向图了 接着,找出这张有向图的所有强连通分量,在强连通分量里面的帅哥都可以娶到自己喜欢的美女,且娶完这个美女后,不会影响到其他人 为什么呢? 假设xi为帅哥,yi和yj为美女,假设给定的完美

POJ 1904 King&#39;s Quest 强连通分量+二分图增广判定

http://www.cnblogs.com/zxndgv/archive/2011/08/06/2129333.html 这位神说的很好 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <string> #include <stack> #include <ve

King&#39;s Quest - poj 1904(强连通分量+外挂输入输出)

题意:国王有N个儿子,每个儿子都有很多喜欢的姑娘,官员为每个王子都找了一个姑娘让他们结婚,不过国王不满意,他想知道他的每个儿子都可以和那个姑娘结婚(前提他的儿子必须喜欢那个姑娘) 分析:因为最下面一行已经给出来每个王子可以结婚的对象了,所以就不必在去求完备匹配了,直接加入反边求出来环就行了,不过注意环中的姑娘未必是王子喜欢的对象,需要再次判断一下才行.ps.第一次知道有输出输入外挂这东西,不过优化的确实很给力. ******************************************

POJ 1904 King&#39;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 i

King&#39;s Quest POJ - 1904(强连通分量)

建图:王子u喜欢女孩v,则u到v连一条边.对于给出的初始完美匹配,王子u与女孩v匹配,则v到u连一条边.然后求SCC. 显然对于同一个SCC中王子数目和女孩数目是相等的,并且从某个王子出发能够到达所有女孩,这样,王子可以和属于同一个SCC中的任意一个女孩结婚,而不会影响其他王子. #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <

UVALive-2966 King&#39;s Quest(强连通+二分图匹配)

题目大意:有n个男孩和和n个女孩,已只每个男孩喜欢的女孩.一个男孩只能娶一个女孩.一个女孩只能嫁一个男孩并且男孩只娶自己喜欢的女孩,现在已知一种他们的结婚方案,现在要求找出每个男孩可以娶的女孩(娶完之后不能影响其他男孩结婚). 题目分析:已知的结婚方案是一个完全匹配.从每个男孩出发向他喜欢的女孩连一条有向边,得到一张完全二分图,实际上这道题是让判断去掉哪一些边使图仍然完全匹配.设男生x1和女生y1是已知方案中要结婚的两个人,假如x1抛弃y1,选择了他也喜欢的y2结婚(也就是去掉边x1->y2),