hdu4685
题解:
二分图匹配
对于每一个单身狗
见一个虚拟的人
然后就可以做了
代码:
#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的更多相关文章
- 强连通+二分匹配(hdu4685 Prince and Princess)
Prince and Princess Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Othe ...
- HDU4685 Prince and Princess 完美搭配+良好的沟通
意甲冠军:今天,有n王子,m公主.现在给他们配对,与王子会嫁给一个男人,他喜欢.公主无法做出选择. 这标题去咬硬,还有一类似的题目poj1904.那个题目也是给王子与公主配对,但那个是王子公主各n个, ...
- HDU4685 Prince and Princess【强连通】
题意: 有n个王子和m个公主,每个王子都会喜欢若干个公主,也就是王子只跟自己喜欢的公主结婚,公主就比较悲惨, 跟谁结婚都行.然后输出王子可能的结婚对象,必须保证王子与任意这些对象中的一个结婚,都不会影 ...
- HDU4685:Prince and Princess(二分图匹配+tarjan)
Prince and Princess Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Othe ...
- hdu4685 最大匹配可能性
题意: 给你n个王子和m个公主,每个王子可以和自己喜欢的公主结婚,问你在不影响最大匹配的前提下每个王子都可以去哪些公主. 思路: 所有王子向他喜欢的公主连一条边,然后匹配一遍, ...
- Prince and Princess
hdu4685:http://acm.hdu.edu.cn/showproblem.php?pid=4685 题意:有n个王子和m个公主,每个王子都会喜欢若干个公主,也就是王子只跟自己喜欢的公主结婚公 ...
- POJ1904 强联通(最大匹配可能性)
题意: 有n个王子,n个公主,然后给你每个王子喜欢的公主,最后问你在不影响最大匹配的前提下,每个王子可以匹配那些公主. 思路: 是hdu4685的减弱版,之前研究过hdu468 ...
随机推荐
- Linux 磁盘
一台物理服务器通常有好几块磁盘(/dev/sda,/dev/sdb),每个磁盘上都可以进行分区(例如对sda进行分区操作:fdisk /dev/sda,可以将sda分成sda1,sda2,sda5等分 ...
- Spring Boot @DeleteMapping
使用DELETE方式进行交互 说明:ResponseData为自定义返回体{String code, String msg, List<?> data} PollutionData 为 ...
- 找不到resources下的文件
今天发现一个很坑的问题,浪费了很长的时间排查问题,特此记录下.目录结构如下图所示: 结果加载文件的时候,一直报错: 找不到resource文件夹下的 conf/mybatis/logDb/ 路径下的文 ...
- CSS 图片
CSS 图片 一.圆角图片 img { border-radius: 8px; } 二.缩略图 border 属性来创建缩略图. img { border: 1px solid #ddd; borde ...
- 20145331 实验一 "Java开发环境的熟悉"
20145331 实验一 "Java开发环境的熟悉" 实验内容 使用JDK和IDE编译.运行简单的Java程序.题目: 实现四则运算,并进行测试. 编写代码 1.首先第一步就是要输 ...
- Ansible Playbooks入门介绍
1.目录结构 2.详细目录 3.主任务文件main.yaml 主任务文件main.yaml - name: print server name and user to remote testbox # ...
- random模块中最常用的几个函数
转自:http://www.cnblogs.com/yd1227/archive/2011/03/18/1988015.html 随机整数:>>> import random> ...
- LightOJ 1356 Prime Independence(质因数分解+最大独立集+Hopcroft-Carp)
http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1356 题意: 给出n个数,问最多能选几个数,使得该集合中的 ...
- Educational Codeforces Round 54 (Rated for Div. 2) DE
D 给出一个无向图,需要删去一些边,想知道最后能有多少个点到1的距离还是过去那么短 如果求一个最短路,然后从删边的角度看,看起来很难做,但是如果从零开始加边就会有做法,如同prim那样,先加入和1直接 ...
- 【Python】“UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9”根因及解决方法
背景 自动化测试调用HTMLTestRunner生成测试报告的时候,出现了编码错误,错误如题 原因 搜索了很多资料,得出的结论是python的str默认是ascii编码,和unicode编码冲突,就会 ...