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了几次.还是想到了正解. 一开始我想的大致方向已经是对的了.先是由王子向每个喜欢的公主建边,再求一次最大匹配,找出匹配后 ...
随机推荐
- Linux使用SSH远程连接方式和更改密码 ,自己空间转移过来的。
一. 远程连接Linux系统需要一个方便的SSH连接工具putty就不错!工具在本日志的附件下载,解压密码是QQ号,云盘访问密码 90891.把远程主机ip和端口号填写上然后选择连接方式为“SSH”. ...
- HDU 5105 Math Problem
让求 f(x)=|a∗x3+b∗x2+c∗x+d|(L≤x≤R)的最大值 这个题目讨论a和b的值,如果a==0的话,那么这个方程就变成了一个一元二次方程,直接找端点和对称轴(如果对称轴在给定的区间内 ...
- Android 中Webview 自适应屏幕
随笔 - 478 文章 - 3 评论 - 113 Android 中Webview 自适应屏幕 webview中右下角的缩放按钮能不能去掉 settings.setDisplayZoomCon ...
- iOS程序的完整启动过程(有storyboard)
1.先执行main函数,main内部会调用UIApplicationMain函数 2.UIApplicationMain函数里面做了什么事情:1> 创建UIApplication对象 2> ...
- 使用PPRevealSideViewController实现侧滑效果
使用起来还是比较简单的, 主要是几个步骤 AppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchi ...
- PHP PDO获取结果集
一.介绍PDO获取结果集,不得不介绍一下PDO是如果执行SQL语句,一般情况下分三种, 1.query()方法 query()方法通常用于返回执行查询后的结果集.语法是这样的:PDOStatement ...
- Java简介(2)-基本概念
1.抽象类:规定一个或多个抽象方法的类别本身必须定义为abstract,抽象类只是用来派生子类,而不能用它来创建对象 2.final类:又称“最终类”,它只能用来创建对象,而不能被继承,与抽象类刚好相 ...
- php处理中文字符串
使用mbstring 先转换成UTF-8编码 mb_convert_encoding(Input::get('tags'),'UTF-8') mbstring用法参考http://php.net/ma ...
- 【行为型】Strategy模式
策略模式意图将解决问题的算法分别封装成一个个对象的形式,并使这些算法对象相互间可被替换.模式比较简单,对于策略对象结构的设计,可抽象一个抽象基类,并定义好相关算法(纯)虚接口,并由各种具体的实现算法子 ...
- S5PV210启动过程分析
一.三星官方推荐方式 1.数据手册<S5PV210_iROM_Application_note>中截取: