传送门

题意:每个儿子都喜欢许多女孩,问每个渣男儿子最多有几个可以选择备胎。他爹也挺渣。。

猛地一看,哇二分匹配,但是想了想输入输出都能卡时间的题目,循环暴力二分匹配必T无疑,在做强连通模块的题所以想了好久也不知道怎么转化。看了大佬的博客,解释的特别好。

首先题目是给了一个完备匹配了的,思想如下:

设一个渣男为m1,一个小女孩为g1,在所给的完备匹配中m1<->g1,他们俩是肯定成立的。

然后渣男m1又喜欢的女孩g2,所以注意此时的图为

g2又去找他的完备匹配的是谁,不管中间多复杂,如果想要成立一个与原来的匹配不同的选择,必定最后有一条边是回到g1的,因为之前选g1的渣男m1他去选g2,所以此时显然就出现了一个环,既然是环,即是强连通,即每一个渣男可以选择强连通分量里边每一个girl,所以此时做法就是男孩向女孩引边,再从女孩向男孩引边,tanjar,最后看每一个男孩对应的女孩是不是一个强连通分量即可。

ac代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>
#define myself i,l,r
#define lson i<<1
#define rson i<<1|1
#define Lson i<<1,l,mid
#define Rson i<<1|1,mid+1,r
#define half (l+r)/2
#define inff 0x3f3f3f3f
#define lowbit(x) x&(-x)
#define me(a,b) memset(a,b,sizeof(a))
#define min4(a,b,c,d) min(min(a,b),min(c,d))
#define min3(x,y,z) min(min(x,y),min(y,z))
typedef long long ll;
using namespace std;
const int maxn=2e3+5;
const int M=2e5+5;
int low[2*maxn],dfn[2*maxn],Stack[2*maxn],inStack[2*maxn],belong[2*maxn],head[2*maxn];
int sign,top,cnt,t,n;
vector<int>ans;
struct node
{int to,p;
}edge[maxn+M];
void init()
{sign=top=cnt=t=0;for(int i=1;i<=2*n;i++){low[i]=dfn[i]=inStack[i]=0;belong[i]=head[i]=-1;}
}
void add(int u,int v)
{edge[sign]=node{v,head[u]};head[u]=sign++;
}
void tanjar(int u)
{low[u]=dfn[u]=++t;Stack[++top]=u;inStack[u]=1;for(int i=head[u];i!=-1;i=edge[i].p){int v=edge[i].to;if(!dfn[v]){tanjar(v);low[u]=min(low[u],low[v]);}else if(inStack[v])low[u]=min(low[u],dfn[v]);}int x;if(low[u]==dfn[u]){cnt++;do{x=Stack[top--];inStack[x]=0;belong[x]=cnt;}while(u!=x);}
}
int main()
{int num,x;while(scanf("%d",&n)!=EOF){init();for(int i=1;i<=n;i++){scanf("%d",&num);while(num--){scanf("%d",&x);add(i,x+n);}}for(int i=1;i<=n;i++){scanf("%d",&x);add(x+n,i);}for(int i=1;i<=n;i++){if(!dfn[i])tanjar(i);}for(int i=1;i<=n;i++){ans.clear();for(int j=head[i];j!=-1;j=edge[j].p){int v=edge[j].to;if(belong[i]==belong[v])ans.push_back(v-n);}sort(ans.begin(),ans.end());int l=ans.size();printf("%d",l);for(int k=0;k<l;k++)printf(" %d",ans[k]);printf("\n");}}return 0;
}

POJ - 1904 King's Quest 强连通tanjar思想相关推荐

  1. poj 1904 King's Quest 强连通分量+匹配

    ========== 题目链接King's Quest ============ 题解:通过原有的完美匹配,反向建边,在同一个强连通分量里面的王子和公主可以匹配,而不影响其他王子的结婚对象. //#i ...

  2. POJ - 1904 King's Quest(强连通缩点)

    题目链接:点击查看 题目大意:给出n个王子和n个公主,每个王子都有喜欢的公主,每个王子初始时都娶到了一位喜欢的公主,题目需要我们求出每个王子所能娶的所有公主,必须保证王子娶了其中任何一个之后,其他的王 ...

  3. poj 1904 King's Quest

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

  4. POJ 1904 King's Quest(强连通分量)

    题目链接 Description Once upon a time there lived a king and he had N sons. And there were N beautiful g ...

  5. POJ 1904 King's Quest(强连通图)题解

    题意:n个王子有自己喜欢的ki个公主,有n个公主,每个王子只能娶一个自己喜欢的公主且不能绿别的王子.现在给你一种王子娶公主的方案,并且保证这种方案是正确的.请你给出,每个王子能娶哪些公主,要求娶这些公 ...

  6. POJ 1904 【强连通分量】.cpp

    题意: 很久很久以前.. 有一个国王.. 他有好几个儿子.. 这些王子都喜欢上了邻国的公主.. 他们准备迎娶自己喜欢的公主中的一个.. 国王就让宰相给列一个清单.. 宰相就给了国王一个清单..上面写明 ...

  7. UVA1327 King‘s Quest(强连通分量、给王子们匹配公主系列 - 1 )

    让我们首先来考虑建图 如果王子u喜欢妹子v那我们可以从u向v连一条有向边 如果妹子v可以与王子u配对(即在配对表上),那我们可以从v向u连一条有向边 对于样例 如果王子和另一个姑娘在同一个连通分量上, ...

  8. poj 1904 tarjan强连通分量(给国王的2000个儿子找老婆 )

    题意:有n个王子,每个王子i有ki个他喜欢的妹子,每个王子只能和喜欢的妹子结婚,大臣给出一个匹配表(假设肯定是对的),每个王子都和一个妹子结婚,但是国王不满意,他要求大臣给他另一个表,每个王子可以和几 ...

  9. HDU - 1269迷宫城堡 -强连通tanjar算法

    为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以 ...

最新文章

  1. 软件工程——视频总结
  2. php表单退出怎么写,PHP提交表单失败后如何保留填写的信息
  3. Android Eclipse之Git插件安装、配置、提交、修改、冲突、查看历史、覆盖。
  4. MySQL后初次密码_mysql第一次安装成功后初始化密码操作步骤
  5. STM8单片机读取DHT11温湿度传感器
  6. 《随机出题软件》《随机分队软件》源码(Windows API)
  7. 马什么梅?I什么N?浅谈 web 前端开发中的国际化
  8. 天涯明月刀ol最新服务器列表,天涯明月刀手游开服表 新区开服时间表汇总[多图]...
  9. html自定义菜单按钮图片,editormd,markdown 自定义导航栏按钮
  10. 音高和频率转换(转载)
  11. 基于Simulink使用激光雷达数据跟踪车辆仿真(附源码)
  12. 志强系列的服务器能吃鸡吗,性能芯变化!三款至强E5 V3服务器体验
  13. 对话祁隆《借我星光》作词人温暖:已获知和合国际收购信息
  14. speak failed:not bound to TTS engine解决方案
  15. 手机号码段简介以及最新手机号段归属地数据库(2018年7月1日)
  16. Android Framework入门介绍
  17. 移动应用开发--实现微博界面(Andriod)
  18. python正则表达式去掉小数点后面的0_java如何去掉一串数字前面没用的0,并且......
  19. Qt Phonon详解
  20. JAVA POI通用Excel导入模板

热门文章

  1. LookupError: unknown encoding: uft-8
  2. Static interface methods are only supported starting with Android N (--min-api 24): void okhttp3.log
  3. 25个iptables常用示例
  4. 2022-2028年中国2,3,6-三甲基苯酚行业市场研究及前瞻分析报告
  5. PyTorch 笔记(20)— torchvision 的 datasets、transforms 数据预览和加载、模型搭建(torch.nn.Conv2d/MaxPool2d/Dropout)
  6. Scala 集合入门
  7. atitit.userService 用户系统设计 v5 q330
  8. Android中实现为TextView添加多个可点击的文本
  9. 进程、线程、多线程相关总结
  10. 3月7日 ArrayList集合