博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 4685 Prince and Princess(匈牙利算法 连通分量)
阅读量:6040 次
发布时间:2019-06-20

本文共 2565 字,大约阅读时间需要 8 分钟。

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

#include
#include
#include
#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
eg[MAXN];vector
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;}

转载地址:http://dsrhx.baihongyu.com/

你可能感兴趣的文章
避免用for循环写数据
查看>>
Dijkstra(变形) POJ 1797 Heavy Transportation
查看>>
关于Webpack详述系列文章 (第三篇)
查看>>
关于Webpack详述系列文章 (第四篇)
查看>>
分布式系统的面试题15
查看>>
个人代码库の创建快捷方式
查看>>
由strcat函数引发的C语言中数组和指针问题的思考
查看>>
无锁编程
查看>>
如何在loadrunner中做关联
查看>>
二叉树的六种遍历方法汇总(转)
查看>>
用wxpython制作可以用于 特征筛选gui程序
查看>>
【转载】 [你必须知道的.NET]目录导航
查看>>
数据存储小例
查看>>
Spring Boot 配置优先级顺序
查看>>
php 信号量
查看>>
C++中构造函数详解
查看>>
数据库课程实习设计——酒店房间预订管理系统
查看>>
vue.js的模板渲染
查看>>
关于H5+css3的一些简单知识
查看>>
Google-Authenticator
查看>>