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了几次.还是想到了正解. 一开始我想的大致方向已经是对的了.先是由王子向每个喜欢的公主建边,再求一次最大匹配,找出匹配后 ...
随机推荐
- codevs 1036 商务旅行 (倍增LCA)
/* 在我还不知道LCA之前 暴力跑的SPFA 70分 三个点TLE */ #include<iostream> #include<cstdio> #include<cs ...
- 错误记录--关于foreach,集合已修改;可能无法执行枚举操作
集合已修改,可能无法执行枚举操作.今天在使用foreach遍历的时候出现了这样的错误.查了一下,这个是使用foreach的典型的错误问题问题.foreach在遍历取数据的过程中,枚举器只允许读,不允许 ...
- css.day.05.eg
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- c - static 变量
static变量和普通的局部变量不同,位于数据区中,在函数的外部初始化. ref: http://www.cnblogs.com/hustcat/archive/2009/06/30/1513755. ...
- 玩转iOS 9的UIDynamics(转)
转自 http://www.cocoachina.com/ios/20150716/12613.html 本文由CocoaChina翻译小组成员AGSpider(微博)翻译自fancypixel的博客 ...
- gitHub远程分支创建
1.在本地master上分出一个项目分支 git checkout -b bug1_dujie git checkout -b bug1_dujie origin/master 在远程添加分支 $gi ...
- 用Javascript的for循环输出质数
<body> <script type="text/javascript"> for(i=2;i<=300;i++){ var prime = tru ...
- JS简易时钟
HTML <div id="clock"> <span></span>:<span></span>:<span&g ...
- 一个测ip和端口是否联通的工具类
public class TestIp { public static void main(String[] args) { Socket connect = new Socket(); try { ...
- 如何使用Instruments诊断App(Swift版):起步-b
无论你写过许多iOS应用,还是刚刚开始你的第一个应用,毫无疑问,你都会想出一些新点子,或者想去弄明白你该怎么做,来让你的app变得更好. 除去添加新特性来优化你的应用,有一件事是所有好的开发者都回去做 ...