HDU4865 Prince and Princess 强连通分量+二分图判定
这个题就是建图费点劲,别的和我上一篇博客一样
然后,参考思路请戳这里http://www.cnblogs.com/wally/archive/2013/09/12/3317883.html
补充:这个思路是对的,然后请注意虚拟只和现实的连接,虚拟的不会和虚拟连接
这样可以保证如果在同一连通分量内,还会形成完美匹配,而且原最大匹配也不会有影响
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <string>
#include <stack>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
#include <utility>
using namespace std;
typedef long long LL;
const int N=2e3+;
const int INF=0x3f3f3f3f;
struct Edge{
int v,next;
}edge[N*N];
int head[N],tot,n,m;
void add(int u,int v){
edge[tot].v=v;
edge[tot].next=head[u];
head[u]=tot++;
}
bool vis[N];
int match[N];
bool dfs(int u){
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].v;
if(vis[v])continue;
vis[v]=true;
if(match[v]==-||dfs(match[v])){
match[u]=v;
match[v]=u;
return true;
}
}
return false;
}
stack<int>s;
bool instack[N],mp[N/][N/];
int dfn[N],low[N],clk,cnt,bel[N];
void targin(int u){
dfn[u]=low[u]=++clk;
instack[u]=true;s.push(u);
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].v;
if(!dfn[v]){
targin(v);
low[u]=min(low[u],low[v]);
}
else if(instack[v])
low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
++cnt;int k;
do{
k=s.top();
s.pop();
instack[k]=false;
bel[k]=cnt;
}while(k!=u);
}
}
vector<int>g;
int main()
{
int T,cas=;
scanf("%d",&T);
while(T--){
printf("Case #%d:\n",++cas);
scanf("%d%d",&n,&m);
memset(head,-,sizeof(head));
memset(mp,,sizeof(mp));
clk=cnt=tot=;
for(int i=;i<=n;++i){
int k;scanf("%d",&k);
for(int j=;j<k;++j){
int u;scanf("%d",&u);
add(i,u+n);
mp[i][u+n]=true;
}
}
int tol=;
memset(match,-,sizeof(match));
for(int i=;i<=n;++i){
memset(vis,,sizeof(vis));
if(dfs(i))++tol;
}
for(int i=;i<=m-tol;++i){
int u=i+;
for(int j=n+;j<=n+m;++j)
add(u,j);
}
for(int i=;i<=n-tol;++i){
int v=+m-tol+i;
for(int j=;j<=n;++j)
add(j,v);
}
int cur=;
for(int i=n+;i<=n+m;++i){
if(match[i]!=-)add(i,match[i]);
else add(i,++cur);
}
cur=+m-tol;
for(int i=;i<=n;++i){
if(match[i]!=-)continue;
else add(++cur,i);
}
memset(instack,,sizeof(instack));
memset(dfn,,sizeof(dfn));
for(int i=;i<=n;++i)
if(!dfn[i])targin(i);
for(int i=;i<=+m-tol;++i)
if(!dfn[i])targin(i);
for(int i=;i<=n;++i){
g.clear();
for(int j=n+;j<=n+m;++j){
if(!mp[i][j]||bel[i]!=bel[j])continue;
g.push_back(j-n);
}
printf("%d",g.size());
for(int j=;j<g.size();++j)
printf(" %d",g[j]);
printf("\n");
}
}
return ;
}
HDU4865 Prince and Princess 强连通分量+二分图判定的更多相关文章
- hdu 4685(强连通分量+二分图)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4685 题意:n个王子和m个公主,王子只能和他喜欢的公主结婚,公主可以和所有的王子结婚,输出所有王子可能 ...
- hdu 4685(强连通分量+二分图的完美匹配)
传送门:Problem 4685 https://www.cnblogs.com/violet-acmer/p/9739990.html 参考资料: [1]:二分图的最大匹配.完美匹配和匈牙利算法 [ ...
- Spoj 2878 KNIGHTS - Knights of the Round Table | 双联通分量 二分图判定
题目链接 考虑建立原图的补图,即如果两个骑士不互相憎恨,就在他们之间连一条无向边. 显而易见的是,如果若干个骑士在同一个点数为奇数的环上时,他们就可以在一起开会.换句话说,如果一个骑士被一个奇环包含, ...
- POJ 1904 King's Quest 强连通分量+二分图增广判定
http://www.cnblogs.com/zxndgv/archive/2011/08/06/2129333.html 这位神说的很好 #include <iostream> #inc ...
- POJ - 2942 Knights of the Round Table (点双联通分量+二分图判定)
题意:有N个人要参加会议,围圈而坐,需要举手表决,所以每次会议都必须是奇数个人参加.有M对人互相讨厌,他们的座位不能相邻.问有多少人任意一场会议都不能出席. 分析:给出的M条关系是讨厌,将每个人视作点 ...
- HDU 4685 Prince and Princess(二分图+强连通分量)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4685 题意:给出n个王子和m个公主.每个王子有一些自己喜欢的公主可以匹配.设最大匹配为M.那么对于每个 ...
- DFS的运用(二分图判定、无向图的割顶和桥,双连通分量,有向图的强连通分量)
一.dfs框架: vector<int>G[maxn]; //存图 int vis[maxn]; //节点访问标记 void dfs(int u) { vis[u] = ; PREVISI ...
- 强连通+二分匹配(hdu4685 Prince and Princess)
Prince and Princess Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Othe ...
- 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 ...
随机推荐
- Lua基础之Function
概述:1.定义和调用 2.多返回值3.可变参数 原文地址 http://blog.csdn.net/dingkun520wy/article/details/50275387 1.定义和调用 函数,在 ...
- JPA2 关于 PagingAndSortingRepository
And --- 等价于 SQL 中的 and 关键字,比如 findByUsernameAndPassword(String user, Striang pwd): Or --- 等价于 SQL 中的 ...
- SSL与TLS的区别以及介绍
转载 :http://kb.cnblogs.com/page/197396/ SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议 ...
- Extjs4 treePanel异步加载菜单(后台从数据库读取)
运行环境:springMVC+mybatis 一.建表 说明:0表示此节点为非叶子节点,即此节点还包括了子节点:1表示此节点为叶子节点,即此节点没有子节点.:关于图标iconCls是从Extjs的文件 ...
- asp.net单点登录(SSO)解决方案
前些天一位朋友要我帮忙做一单点登录,其实这个概念早已耳熟能详,但实际应用很少,难得最近轻闲,于是决定通过本文来详细描述一个SSO解决方案,希望对大家有所帮助.SSO的解决方案很多,但搜索结果令人大失所 ...
- zTree -- jQuery 树插件
http://www.ztree.me/v3/main.php#_zTreeInfo http://plugins.jquery.com/zTree.v3/ 例子:http://www.ztree.m ...
- Binary search for the first element greater than target
We all know how to search through an array for an element whose value equals the target value, but h ...
- Eclipse 插件开发 —— 深入理解查找(Search)功能及其扩展点
引言 查找功能是计算机语言开发环境 / 平台的一个非常重要的特性.Eclipse 也不例外,它提供了丰富的查找功能(用户可以输入正则表达式或任意字符串,指定查找范围和匹配选项等等),并且提供了简单易用 ...
- HDU 1203 I NEED A OFFER!(01 背包DP)
点我看题目 题意 : 中文题不详述. 思路 :类似于01背包的DP,就是放与不放的问题,不过这个要求概率,至少得到一份offer的反面就是一份也得不到,所以先求一份也得不到的概率,用1减掉就可以得到所 ...
- 2013 Multi-University Training Contest 5 k-th point
刚开始我也不知道怎么做,后来慢慢就推出来了…… 对于样例 2 1 0,结果是2/3 2 2 0,结果是4/5 3 2 0,结果是6/7 3 2 1,结果是9/14=6/7*3/4 …… 之后就会发现每 ...