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了几次.还是想到了正解. 一开始我想的大致方向已经是对的了.先是由王子向每个喜欢的公主建边,再求一次最大匹配,找出匹配后 ...
随机推荐
- ubuntu 修改运行级别
只转载了成功的, 具体参见原文 http://www.2cto.com/os/201308/237632.html 第一种方法:(内核级别的) Sudo vi /etc/default/grub ...
- 地址栏访问Action,后来方法执行两次
SSH框架,在地址栏输入URL访问Action,后台访问会访问两次.很奇怪. 经排查,最终问题在于方法名称写错了.将getOpinionByPN()修改成queryOpinionByPN(),没有问题 ...
- webApp禁止用户保存图像
img { -webkit-touch-callout: none; }
- 【转载】ASP.NET线程安全与静态变量的生命周期浅谈
ASP.NET线程安全所涉及的是什么呢?让我们先来看看静态变量的生命周期问题,下面是我理解的静态变量的生命周期: void Application_Start开始 void Application_E ...
- MSChart使用之动态生成多个多行ChartArea
前台代码: <asp:Chart ID=" > <Titles> <asp:Title Name="Title1" runat=" ...
- AFN发送请求失败
发送请求出现这个错误 Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Coc ...
- mysql操作1
一.连接MYSQL.格式: mysql -h主机地址 -u用户名 -p用户密码1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root - ...
- ejabberd,erlang,简单看了一下,总结一下,很肤浅
本来也没打算深入学习erlang,就是看一下他们的大概思路erlang每个自定义函数都能注册成进程,每个节点通过erl -name 'name@ip'.进去后,可以直接做远程调用,节点之间就靠一个连接 ...
- 初涉JavaScript模式 (12) : 沙箱模式
引子 上一篇说了模块模式,而对于其中的命名空间模式其实也是有着一些问题,比如每添加一个模块或则深入叠加都会导致长命名,并且对于多个库的不同版本同时运行,一不小心就会污染全局标识,而这两天也发现了JSe ...
- grails框架中读取txt文件内容将内容转换为json格式,出现异常Exception in thread "main" org.json.JSONException: A JSONObject text must begin with '{' at character 1 of [...]
Exception in thread "main" org.json.JSONException: A JSONObject text must begin with '{' a ...