H - Prince and Princess - HDU 4685(二分匹配+强连通分量)
1 2
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std; const int MAXN = ;
const int Base = ;
///base 王子的编号从1开始 公主的编号从base+1开始, 虚拟点的编号从base*2+1开始
int N, M;
bool love[][];
vector< vector <int> >ans;
/***************邻接表*********************/
struct Edge{int v, next;}e[MAXN*MAXN];
int Head[MAXN], cnt; void AddEdge(int u, int v)
{
e[cnt].v = v;
e[cnt].next = Head[u];
Head[u] = cnt++;
}
/**************Tarjan**********************/
int dfn[MAXN], low[MAXN], Index;
int Stack[MAXN], instack[MAXN], top;
int belong[MAXN], bnt; void Tarjan(int i)
{
int v; dfn[i] = low[i] = ++Index;
Stack[++top] = i, instack[i] = true; for(int j=Head[i]; j!=-; j=e[j].next)
{
v = e[j].v; if( !dfn[v] )
{
Tarjan(v);
low[i] = min(low[i], low[v]);
}
else if( instack[v] )
low[i] = min(low[i], dfn[v]);
} if(low[i] == dfn[i])
{
++bnt;
do
{
v = Stack[top--];
instack[v] = false;
belong[v] = bnt;
if(v > Base)
ans[bnt].push_back(v-Base);
}
while(i != v);
}
}
/***************匈牙利********************/
int Lx[MAXN], Ly[MAXN];
bool used[MAXN]; bool Find(int i)
{
for(int j=Head[i]; j!=-; j=e[j].next)
{
int v = e[j].v; if( !used[v] )
{
used[v] = true;
if( !Ly[v] || Find(Ly[v]) )
{
Ly[v] = i;
Lx[i] = v; return true;
}
}
} return false;
}
void XYL()///顺便添加虚拟点
{
int i, j, k, sum=; for(i=; i<=N; i++)
{
memset(used, false, sizeof(used));
sum += Find(i);
} k = Base * + ;///虚拟点开开始处 for(i=; i<=N; i++)
{///遍历王子部分,看那个王子没有匹配,为他虚拟一个公主,这个公主所有的王子都喜欢
if(Lx[i] == false)
{
Lx[i] = k;
Ly[k] = i; for(j=; j<=N; j++)
AddEdge(j, k);
k++;
}
} for(i=Base+; i<=Base+M; i++)
{///遍历公主部分,看哪个公主没有匹配,为她虚拟一个王子,这个王子喜欢所有的公主
if(Ly[i] == false)
{
Lx[k] = i;
Ly[i] = k; for(j=Base+; j<=Base+M; j++)
AddEdge(k, j);
k++;
}
} for(i=Base+; i<k; i++)
{///匹配的点添加反边
AddEdge( i, Ly[i] );
}
} /***************初始化********************/
void InIt()
{
ans.clear();
ans.resize(MAXN); memset(love, false, sizeof(love));
memset(dfn, false, sizeof(dfn));
memset(Head, -, sizeof(Head));
memset(Lx, false, sizeof(Lx));
memset(Ly, false, sizeof(Ly)); cnt = Index = bnt = ;
}
/******************************************/
int main()
{
int T, t=; scanf("%d", &T); while(T--)
{
int i, j, v, Len; scanf("%d%d", &N, &M);
InIt(); for(i=; i<=N; i++)
{
scanf("%d", &Len); while(Len--)
{
scanf("%d", &v);
AddEdge(i, v+Base);
love[i][v] = true;
}
} XYL(); for(i=; i<=N; i++)
{
if( !dfn[i] )
Tarjan(i);
} printf("Case #%d:\n", t++);
for(i=; i<=N; i++)
{
v = belong[i];
Len = ans[v].size(); int a[MAXN], k=; for(j=; j<Len; j++)
{///王子必须喜欢这个公主才行
if(love[i][ ans[v][j] ] == true)
a[k++] = ans[v][j];
} sort(a, a+k); printf("%d", k);
for(j=; j<k; j++)
printf(" %d", a[j]);
printf("\n");
}
} return ; }
H - Prince and Princess - HDU 4685(二分匹配+强连通分量)的更多相关文章
- Prince and Princess HDU - 4685(匹配 + 强连通)
Prince and Princess Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Othe ...
- hdu 4685 二分匹配+强连通分量
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4685 题解: 这一题是poj 1904的加强版,poj 1904王子和公主的人数是一样多的,并且给出 ...
- poj1904 二分图匹配+强连通分量
http://poj.org/problem?id=1904 Description Once upon a time there lived a king and he had N sons. An ...
- 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(匹配+强连通分量)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4685 思路:想了好久,终于想明白了,懒得写了,直接copy大牛的思路了,写的非常好! 做法是先求一次最 ...
- hdu 5093 二分匹配
/* 题意:给你一些冰岛.公共海域和浮冰,冰岛可以隔开两个公共海域,浮冰无影响 求选尽可能多的选一些公共海域点每行每列仅能选一个. 限制条件:冰山可以隔开这个限制条件.即*#*可以选两个 预处理: * ...
- hdu 4169 二分匹配最大独立集 ***
题意:有水平N张牌,竖直M张牌,同一方向的牌不会相交.水平的和垂直的可能会相交,求最少踢出去几张牌使剩下的牌都不相交. 二分匹配 最小点覆盖=最大匹配. 链接:点我 坐标点作为匹配的端点 #inclu ...
- Battle ships HDU - 5093二分匹配
Battle shipsHDU - 5093 题目大意:n*m的地图,*代表海洋,#代表冰山,o代表浮冰,海洋上可以放置船舰,但是每一行每一列只能有一个船舰(类似象棋的車),除非同行或者同列的船舰中间 ...
- hdu 4685 简单匹配+Tarjan算法
思路:首先看到这题以为能用poj1904的模版直接A掉,WA了几次,然后又TLE了几次.还是想到了正解. 一开始我想的大致方向已经是对的了.先是由王子向每个喜欢的公主建边,再求一次最大匹配,找出匹配后 ...
随机推荐
- (总结)Nginx配置文件nginx.conf中文详解 <转>
转自 http://www.ha97.com/5194.html #定义Nginx运行的用户和用户组user www www; #nginx进程数,建议设置为等于CPU总核心数.worker_proc ...
- 国都企信通短信平台发送手机短信的python脚本一例
一年前,由于工作需要,给以色列的同事解释一下国都短信平台的短信发送格式,本来不懂python的我硬着头皮写了一个sample,比较粗,能用,但不优美,希望以后学会python能改得像我同事写的那么优雅 ...
- 使用python求字符串或文件的MD5
使用python求字符串或文件的MD5 五月 21st, 2008 #以下可在python3000运行. #字符串md5,用你的字符串代替'字符串'中的内容. import hashlib md5=h ...
- js异步的理解---千呼万唤始出来啊!
编译完成后(先分配给变量空间和function(){}命名的函数,var = function(){}这种函数也仅仅只是分配了个空间,还没有赋值个函数给他!),调用了若不是undefined就执行, ...
- Oracle数据表恢复
用于直接drop掉表的情况(plsql developer直接删掉表就是drop操作) 查删除的表select object_name,original_name,partition_name,typ ...
- 关于IO学习的几个函数
这是最近学到的几个关于IO文件操作的几个小算法,今天总结出来. 1. 删除一个给定的目录,这上目录不为空目录,使用递归来实现 public void test04(File file) { File[ ...
- Nginx反向代理配置配置实例
为了节省支出,公司需要将分布在不同机器的站点都迁移到一台机器,而目前不同机器运行的是不同的web服务,部分是nginx,部分是apache,由于牵涉较多rewrite规则,为了节省修改功夫,打算迁移后 ...
- SQL SERVER 2012疑难问题解决方法
问题一: 问题描述 SQL SERVER 2012 尝试读取或写入受保护的内存.这通常指示其他内存已损坏. (System.Data) 解决办法 管理员身份运行 cmd -> 输入 netsh ...
- jdbc中的Statement对象和Preparedstatement对象的区别,以及通过jdbc操作调用存储过程
一. java.sql.* 和 javax.sql.*的包的类结构 |- Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接口. |- connect(url, p ...
- JQuery相关的网络资源
jquery插件列表 国外网站:http://plugins.jquery.com/ 国内网站:http://www.oschina.net/project/tag/273/jquery