题解:

二分图匹配

对于每一个单身狗

见一个虚拟的人

然后就可以做了

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
const int M=+;
struct EDGE{int v,next;}edge[M];
int first[N],low[N],dfn[N],sta[M],belong[N];
int ans[N],match[N],flag[N];
bool instack[N],vis[N];
int n,m,g,cnt,top,scc,maxn;
int Scan()
{
int res=,ch,flag=;
if ((ch=getchar())=='-')
flag=;
else if (ch>=''&&ch<='')
res=ch-'';
while((ch=getchar())>=''&&ch<='')
res=res*+ch-'';
return flag?-res:res;
}
void Out(int a)
{
if (a>)
Out(a/);
putchar(a%+'');
}
void AddEdge(int u,int v)
{
edge[g].v=v;
edge[g].next=first[u];
first[u]=g++;
}
int min(int a,int b)
{
return a<b?a:b;
}
int max(int a,int b)
{
return a>b?a:b;
}
void init()
{
g=cnt=top=scc=;
memset(first,-,sizeof(first));
memset(dfn,,sizeof(dfn));
memset(instack,,sizeof(instack));
memset(flag,,sizeof(flag));
n=Scan();
m=Scan();
maxn=max(n,m);
}
bool dfs(int u)
{
int i,v;
for (i=first[u];i!=-;i=edge[i].next)
{
v=edge[i].v;
if (!vis[v])
{
vis[v]=;
if (match[v]==||dfs(match[v]))
{
match[v]=u;
flag[u]=v;
return ;
}
}
}
return ;
}
void xiong()
{
int i;
memset(match,,sizeof(match));
for (i=;i<=maxn;i++)
{
memset(vis,,sizeof(vis));
dfs(i);
}
}
void Tarjan(int u)
{
low[u]=dfn[u]=++cnt;
sta[++top]=u;
instack[u]=;
for (int i=first[u];i!=-;i=edge[i].next)
{
int v=edge[i].v;
if (!dfn[v])
{
Tarjan(v);
low[u]=min(low[u],low[v]);
}
else if (instack[v])low[u]=min(low[u],dfn[v]);
}
if (low[u]==dfn[u])
{
scc++;
while ()
{
int v=sta[top--];
instack[v]=;
belong[v]=scc;
if (u==v)
break;
}
}
}
void build()
{
int i,k,v,j;
for (i=;i<=n;i++)
{
k=Scan();
while(k--)
{
v=Scan();
AddEdge(i,v+maxn);
}
}
xiong();
int all=*maxn;
for (i=;i<=maxn;i++)
{
if (!flag[i])
{
all++;
for (j=;j<=maxn;j++)
AddEdge(j,all);
match[all]=i;
flag[i]=all;
}
} for (i=maxn+;i<=*maxn;i++)
{
if (!match[i])
{
all++;
for (j=maxn+;j<=*maxn;j++)
AddEdge(all,j);
flag[all]=i;
match[i]=all;
}
}
for (i=;i<=all;i++)
if (flag[i])AddEdge(flag[i],i);
}
void solve()
{
int i,u,v;
for (i=;i<=maxn;i++)
if (!dfn[i])Tarjan(i);
for (u=;u<=n;u++)
{
int count=;
for (i=first[u];i!=-;i=edge[i].next)
{
v=edge[i].v;
if (belong[u]==belong[v])
{
if (v-maxn>m)
continue;
ans[count++]=v-maxn;
}
}
sort(ans,ans+count);
Out(count);
for (i=;i<count;i++)
{
putchar(' ');
Out(ans[i]);
}
putchar('\n');
}
}
int main()
{
int t=Scan();
for (int cas=;cas<=t;cas++)
{
init();
build();
printf("Case #%d:\n",cas);
solve();
}
return ;
}

hdu4685的更多相关文章

  1. 强连通+二分匹配(hdu4685 Prince and Princess)

    Prince and Princess Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Othe ...

  2. HDU4685 Prince and Princess 完美搭配+良好的沟通

    意甲冠军:今天,有n王子,m公主.现在给他们配对,与王子会嫁给一个男人,他喜欢.公主无法做出选择. 这标题去咬硬,还有一类似的题目poj1904.那个题目也是给王子与公主配对,但那个是王子公主各n个, ...

  3. HDU4685 Prince and Princess【强连通】

    题意: 有n个王子和m个公主,每个王子都会喜欢若干个公主,也就是王子只跟自己喜欢的公主结婚,公主就比较悲惨, 跟谁结婚都行.然后输出王子可能的结婚对象,必须保证王子与任意这些对象中的一个结婚,都不会影 ...

  4. HDU4685:Prince and Princess(二分图匹配+tarjan)

    Prince and Princess Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Othe ...

  5. hdu4685 最大匹配可能性

    题意:       给你n个王子和m个公主,每个王子可以和自己喜欢的公主结婚,问你在不影响最大匹配的前提下每个王子都可以去哪些公主. 思路:       所有王子向他喜欢的公主连一条边,然后匹配一遍, ...

  6. Prince and Princess

    hdu4685:http://acm.hdu.edu.cn/showproblem.php?pid=4685 题意:有n个王子和m个公主,每个王子都会喜欢若干个公主,也就是王子只跟自己喜欢的公主结婚公 ...

  7. POJ1904 强联通(最大匹配可能性)

    题意:       有n个王子,n个公主,然后给你每个王子喜欢的公主,最后问你在不影响最大匹配的前提下,每个王子可以匹配那些公主. 思路:       是hdu4685的减弱版,之前研究过hdu468 ...

随机推荐

  1. The 15th UESTC Programming Contest Preliminary M - Minimum C0st cdoj1557

    地址:http://acm.uestc.edu.cn/#/problem/show/1557 题目: Minimum C0st Time Limit: 3000/1000MS (Java/Others ...

  2. NodeJS中间层搭建

    前言 最近碰了个壁,公司开发的一个新项目里我大胆地提出要前后端完全分离,用JavaScript模板引擎.ajax.路由等技术替代繁琐的前后端混合的业务逻辑,项目进行到一半前辈提出来仅仅靠前端的力量无法 ...

  3. QML学习之浅谈Window

     转载地址:http://blog.csdn.net/kanchuan1905/article/details/53762788 在Qt Quick的世界里,Window对象用于创建一个与操作系统相关 ...

  4. iOS开发之HelloKit代码片段

    完整代码托管:https://github.com/1042710553/HelloKit.git /************************/plist/****************** ...

  5. Js 将 Date 转化为指定格式的String

    // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占 ...

  6. jquery试题

    1.下面哪种说法是正确的? 您的回答:jQuery 是 JavaScript 库 2.jQuery 使用 CSS 选择器来选取元素? 您的回答:正确 3.jQuery 的简写是? 您的回答:$ 符号 ...

  7. Python面试题之回调函数

    0x00 概述 编程分为两类:系统编程(system programming)和应用编程(application programming).所谓系统编程,简单来说,就是编写库:而应用编程就是利用写好的 ...

  8. 前端学习之NaN浅析

    在学习Java集合的时候遇到了Float.isNaN(float)函数,点进去一看就不理解了,函数实现如下: public static boolean isNaN(float v) { return ...

  9. PHP(Mysql/Redis)消息队列的介绍及应用场景案例

    在进行网站设计的时候,有时候会遇到给用户大量发送短信,或者订单系统有大量的日志需要记录,还有做秒杀设计的时候,服务器无法承受这种瞬间的压力,无法正常处理,咱们怎么才能保证系统正常有效的运行呢?这时候我 ...

  10. Send2MyKindle使用说明文档

    软件下载地址为:Send2MyKindle 功能简介 该软件主要功能为在Windows下将Kindle电子书发送到亚马逊中国网站注册的Kindle账户.整个软件界面如下图所示: 使用步骤 使用前的准备 ...