hdu 4685 Prince and Princess(匈牙利算法 连通分量)
看了别人的题解。须要用到匈牙利算法的强连通算法
#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(匈牙利算法 连通分量)的更多相关文章
- HDU 4685 Prince and Princess 二分图匹配+tarjan
Prince and Princess 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4685 Description There are n pri ...
- 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 ...
- HDU 4685 Prince and Princess(二分图+强连通分量)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4685 题意:给出n个王子和m个公主.每个王子有一些自己喜欢的公主可以匹配.设最大匹配为M.那么对于每个 ...
- HDU 4685 Prince and Princess(二分匹配+强联通分量)
题意:婚配问题,但是题目并不要求输出最大匹配值,而是让我们输出,一个王子可以与哪些王妃婚配而不影响最大匹配值. 解决办法:先求一次最大匹配,如果有两个已经匹配的王妃,喜欢她们两个的有两个或者以上相同的 ...
- HDU 4685 Prince and Princess
强连通分量,看大神的题解才会写的.... http://www.cnblogs.com/kuangbin/p/3261157.html 数据量有点大,第一次Submit 2995ms过的,时限3000 ...
- hdu 2063 给男女匹配 (匈牙利算法)
来源:http://acm.hdu.edu.cn/showproblem.php?pid=2063 题意: 有k个组合a,b组合,代表a愿意与b坐过山车,共m个女生 n个男生,问有多少个满意的匹配 题 ...
- HDU 2063 过山车 (匈牙利算法)
题目链接:HDU 2063 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩 ...
- hdu 1013 过山车 匈牙利算法(代码+详细注释)
过山车 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- hdu 2063 过山车(匈牙利算法模板)
http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车 Time Limit: 1000/1000 MS (Java/Others) Memory ...
随机推荐
- 8天玩转并行开发——第三天 plinq的使用
原文 8天玩转并行开发——第三天 plinq的使用 相信在.net平台下,我们都玩过linq,是的,linq让我们的程序简洁优美,简直玩的是爱不释手,但是传统的linq只是串行代码,在并行的 年代如果 ...
- 首款符合PICO-ITX规格的A20开源硬件开发平台
http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5NzM0MjcyMQ==&appmsgid=10001083&itemidx=2&am ...
- TCP/IP协议的编写《转载》
基于HHARM9-EDU的TCP/IP(UDP)协议的实现 原文网址:http://blog.csdn.net/lhj0503/article/details/3323788 摘 要:嵌入式技术的发展 ...
- 发掘ListBox的潜力(一):自动调整横向滚动条宽度
<自绘ListBox的两种效果>一文帖出之后,从反馈信息来看,大家对这种小技巧还是很认同.接下来我将继续围绕ListBox写一系列的文章,进一步发掘ListBox的潜力,其中包括:自动调整 ...
- Excel单元格内容太多会覆盖遮住下一单元格范围
Excel单元格内容太多会覆盖遮住下一单元格范围分步阅读 Excel中的单元格内容,有着不同的对齐方式.用户可根据自己的需求,在处理数据的时候,自行设置所需要的对齐方式. 当您在处理数据的时候,如果设 ...
- 基于visual Studio2013解决面试题之0403串联字符串
题目
- android:改动PagerTabStrip中的背景颜色,标题字体的样式、颜色和图标以及指示条的颜色
1.改动PagerTabStrip中的背景颜色 我们在布局中直接设置background属性就可以: <android.support.v4.view.ViewPager android:id= ...
- 【deep learning学习笔记】注释yusugomori的LR代码 --- 模型测试
测试部分代码: void test_lr() { srand(0); double learning_rate = 0.1; double n_epochs = 500; int train_N = ...
- STM8S 串口应用 UART2 STM8S105
//少说话.多做事,下面是我验证过没有问题的串口发送接受数据 //使用MCU stm8s105c6 UART2 //初始化时调用: GPIO_DeInit(GPIOD); /* Configure P ...
- spice for openstack
nova.conf vnc_enabled=False [Spice] agent_enabled=True enabled=True html5proxy_base_url=http://x.x.x ...