看了别人的题解。须要用到匈牙利算法的强连通算法

#include<cstdio>
#include<algorithm>
#include<vector>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
const int MAXN = 1005;
int n, m;
int mb[MAXN], ma[MAXN];
bool vis[MAXN], gl[MAXN][MAXN];
vector<int> eg[MAXN];
vector<int> mmp[MAXN], res;
int dfs(int a)
{
for (int i = 0; i< eg[a].size(); ++i)
{
int v = eg[a][i];
if (!vis[v])
{
vis[v] = 1;
if (!mb[v] || dfs(mb[v]))
{
mb[v] = a;
ma[a] = v;
return 1;
}
}
}
return 0;
}
int hungary(int a)
{
int cnt = 0;
memset(mb, 0, sizeof mb);
for (int i = 1; i<= a; ++i)
{
memset(vis, 0, sizeof vis);
cnt += dfs(i);
}
return cnt;
}
int dfn[MAXN], low[MAXN], zu, belong[MAXN];
int nc;
int stk[MAXN], top, isinstk[MAXN];
void tarjan(int u)
{
dfn[u] = low[u] = nc++;
stk[top++] = u;
isinstk[u] = 1;
for (int i = 0; i< mmp[u].size(); ++i)
{
int v = mmp[u][i];
if (dfn[v] == -1)
{
tarjan(v);
low[u] = min(low[u], low[v]);
}
else if (isinstk[v] && low[u] > dfn[v])
{
low[u] = dfn[v];
}
}
if (dfn[u] == low[u])
{
int v;
do
{
v = stk[--top];
isinstk[v] = 0;
belong[v] = zu;
}while( v != u);
zu++;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
int t;
scanf("%d", &t);
for (int o = 1; o<= t; ++o)
{
printf("Case #%d:\n", o);
scanf("%d%d", &n, &m);
for (int i = 1; i<= n; ++i)
{
int k, a;
scanf("%d", &k);
eg[i].clear();
while (k--)
{
scanf("%d", &a);
eg[i].push_back(a);
}
}
int cna = hungary(n);
cna = n+m-cna;
for (int i=n+1; i<= cna; ++i)
{
eg[i].clear();
for (int j = 1; j<= cna; ++j)
{
eg[i].push_back(j);
}
}
for (int i=m+1; i<= cna; ++i)
{
for (int j = 1; j<= n; ++j)
{
eg[j].push_back(i);
}
}
int nmc = hungary(cna);
for (int i = 1; i<= cna; ++i) mmp[i].clear();
for (int i = 1; i<= cna; ++i)
{
int a = mb[i];
for (int j = 0; j< eg[a].size(); ++j)
{
int v = eg[a][j];
if (v == i) continue;
mmp[i].push_back(v);
}
}
nc = 1;
memset(dfn, -1, sizeof dfn);
memset(low, -1, sizeof low);
top = 0;
zu = 0;
for (int i = 1; i<= cna; ++i)
{
if (dfn[i] == -1)
tarjan(i);
}
memset(gl, 0, sizeof gl);
for (int i = 1; i<= cna; ++i)
{
for (int j = 0; j< eg[i].size(); ++j)
{
gl[i][eg[i][j]] = 1;
}
}
for (int i = 1; i<= n; ++i)
{
res.clear();
for (int j = 1; j<= m; ++j)
{
if (gl[i][j] && belong[j] == belong[ma[i]])
res.push_back(j);
}
int sz = res.size();
printf("%d", sz);
for (int j = 0; j< sz; ++j)
{
printf(" %d", res[j]);
}
puts("");
}
}
return 0;
}

hdu 4685 Prince and Princess(匈牙利算法 连通分量)的更多相关文章

  1. HDU 4685 Prince and Princess 二分图匹配+tarjan

    Prince and Princess 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4685 Description There are n pri ...

  2. HDU 4685 Prince and Princess (2013多校8 1010题 二分匹配+强连通)

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

  3. HDU 4685 Prince and Princess(二分图+强连通分量)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4685 题意:给出n个王子和m个公主.每个王子有一些自己喜欢的公主可以匹配.设最大匹配为M.那么对于每个 ...

  4. HDU 4685 Prince and Princess(二分匹配+强联通分量)

    题意:婚配问题,但是题目并不要求输出最大匹配值,而是让我们输出,一个王子可以与哪些王妃婚配而不影响最大匹配值. 解决办法:先求一次最大匹配,如果有两个已经匹配的王妃,喜欢她们两个的有两个或者以上相同的 ...

  5. HDU 4685 Prince and Princess

    强连通分量,看大神的题解才会写的.... http://www.cnblogs.com/kuangbin/p/3261157.html 数据量有点大,第一次Submit 2995ms过的,时限3000 ...

  6. hdu 2063 给男女匹配 (匈牙利算法)

    来源:http://acm.hdu.edu.cn/showproblem.php?pid=2063 题意: 有k个组合a,b组合,代表a愿意与b坐过山车,共m个女生 n个男生,问有多少个满意的匹配 题 ...

  7. HDU 2063 过山车 (匈牙利算法)

    题目链接:HDU 2063 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩 ...

  8. hdu 1013 过山车 匈牙利算法(代码+详细注释)

    过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  9. hdu 2063 过山车(匈牙利算法模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory ...

随机推荐

  1. Expert for SQL Server 诊断系列

    Expert for SQL Server 诊断系列 Expert 诊断优化系列------------------锁是个大角色   前面几篇已经陆续从服务器的几个大块讲述了SQL SERVER数据库 ...

  2. OpenGL框架+QT版

    原地址:http://blog.chinaunix.net/uid-25799257-id-3498005.html 之前一直做地图的算法,没什么时间学习opengl,之前看nehe_OpenGL.c ...

  3. js 动态切换视频

    如图所示,想要一个这样的效果,就是点击下面视频标题时,上面的视频跟着切换,但是要求页面不重新加载. 参考文章在这里 这里贴上部分代码供大家参考. <li id="about_li6&q ...

  4. 1.1.0-学习Opencv与MFC混合编程之---全屏截图,保存为BMP图像(并增加快捷键)

    源代码:http://download.csdn.net/detail/nuptboyzhb/3961677 Ø  添加全屏截图菜单项,菜单项的属性如下; Ø  为该菜单项建立类向导. 编辑消息处理函 ...

  5. spring Jdbc自己主动获取主键。

    学习了下springjdbc,感觉挺有用的,相对来说springjdbc 扩展性相当好了 package com.power.dao; import java.lang.reflect.Paramet ...

  6. [LeetCode][Java] 3Sum Closest

    题目: Given an array S of n integers, find three integers in S such that the sum is closest to a given ...

  7. Transformations 方块转换

    题目是中文题,就不做什么解释了,纯模拟题,主要要搞清楚这几种装换方式下标的变化: 第一种:顺时针旋转90度: c[j][n-i+1]=a[i][j]; 第二种:旋转180度: c[n-i+1][n-j ...

  8. javascript (十四) dom

    通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素. HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object M ...

  9. 深度RAMOS,把操作系统全部安装在内存上

     你看下深度RAMOS就知道了  RAMOS+音速启动+绿色软件+云端  很爽 http://www.shenduwin7.com/jiaocheng/52.html

  10. Android 系统搜索框(有浏览记录)

    实现Android 系统搜索框(有浏览记录),先看下效果: 一.配置搜索描述文件  要在res中的xml文件加创建sreachable.xml,内容如下: <?xml version=" ...