题解:

二分图匹配

对于每一个单身狗

见一个虚拟的人

然后就可以做了

代码:

#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. BitmapFactory.decodeStream(inputStream)返回null的解决方法

    场景:Android,通过inputStream从网络上获取图片 随后两次使用BitmapFactory对InputStream进行操作,一次获取宽高,另一次缩放 但是在缩放时,发现inputStre ...

  2. 简单介绍--TOSCA自动化测试工具

    1.工具源自 TOSCA由公司Tricentis研发.这是一家来自奥地利的软件初创企业,专门帮助企业开发团队进行自动化软件测试.(百科) TOSCA的思想是,不用会编程的测试人员可以直接上手自动化. ...

  3. Postman 把response的值自动放到变量里

    @ 1里面定义个变量2 3这里加上postman.setEnvironmentVariable("MatchID",JSON.parse(responseBody)); 这样rep ...

  4. $ 一步一步学Matlab(1)——初识Matlab

    本文分四步走策略:第一,Matlab是个什么玩意:第二,为什么要学Matlab:第三,怎样轻松.无痛.少走弯路地学习Matlab:第四,怎样写一个Matlab的Hello World.通过这四步走,达 ...

  5. [日志]logback告警

    开发过程中,难免会有发生错误或异常的时候,有些是需要及时通知到相关开发人员的.logback可以通过简单的配置达到邮件告警的目的. 一.错误告警 如下配置,所有Error级别的log发送邮件告警给re ...

  6. debug教程

    名称 解释 格式 a (Assemble) 逐行汇编 a [address] c (Compare) 比较两内存块 c range address d (Dump) 内存16进制显示 d [addre ...

  7. mongodb入门很简单(3)

     ##简单的mongodb入门命令## 1.show dbs;      //查看当前数据库 2.use databaseName;         //选库 3.show tables/collec ...

  8. Linux下安装SVN服务端

    安装 使用yum安装非常简单: yum install subversion 配置 2.1. 创建仓库 我们这里在/home下建立一个名为svn的仓库(repository),以后所有代码都放在这个下 ...

  9. .NET Framework 系统要求

    .NET Framework 3.5对操作系统的要求 .NET Framework 4 对操作系统的要求 .NET Framework 4.5对操作系统的要求

  10. tomcat优化方案(转)

    1.内存设置(VM参数调优) (1).Windows环境下,是tomcat解压版(执行startup.bat启动tomcat) ,解决办法: 修改“%TOMCAT_HOME%\bin\catalina ...