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 ...
随机推荐
- man手册使用
1.是普通的命令 2.是系统调用,如open,write之类的(通过这个,至少可以很方便的查到调用这个函数,需要加什么头文件) 3.是库函数,如printf,fread 4.是特殊文件,也就是/dev ...
- 一个 XSD 实例
一个 XSD 实例 本节会为您演示如何编写一个 XML Schema.您还将学习到编写 schema 的不同方法. XML 文档 让我们看看这个名为 "shiporder.xml" ...
- ACCESS数据库操作教程
网易学院视频教程: 上:http://tech.163.com/06/0621/17/2K5K0C2200091U6J.html中:http://tech.163.com/06/0621/17/2K5 ...
- python url编码
1.quote:使用适合URL内容的转义序列替换String中的特殊字符. 2.quote_plus:调用quote并使用“+”替换所有空格 3.unquote:使用转义字符的单字符对应物替换'%xx ...
- 去除右键菜单opendlg
环境:windows8.1专业版 未知文件类型,右键会多出一个opendlg的选项!下面是移除的方法: 将下面的内容复制到记事本,并另存为XXX .reg,导入注册表即可! Windows Reg ...
- 锋利的JQuery-认识Jquery
今天开始学习菜鸟的JQuery,这本书在一前看过一遍了,但是由于虽然看了,但是将近一年在工作中基本上没有用上,很是悲催,菜鸟想,用一到两个星期时间把这本书看一遍吧.就像菜鸟前面的jsdom一样,菜鸟写 ...
- JavaScript DOM高级程序设计2.1创建可重用的对象--我要坚持到底!
1.对象中包含什么 在javascript中,从函数到字符串实际上都是对象 继承 //创建一个person对象的实例 var penson={}; person.getName=function(){ ...
- 关于web会话中的session过期时间的设置
关于web会话中的session过期时间的设置 1.操作系统: 步骤:开始——〉管理工具——〉Internet信息服务(IIS)管理器——〉网站——〉默认网站——〉右键“属性”——〉主目录——〉配置— ...
- GPRS连接失败问题
备注:采用的是SIMCOM的SIM900模块 1. GPRS连接失败问题 2013.08.06测试9台C2000两次,两次之间是机器拿开电池,间隔40分钟左右,每次都出现一台(但不是同一台): ⑴9台 ...
- linux下tar压缩/解压的使用(tar) 压缩/解压
压缩: tar -zcvf 压缩后文件名.tar.gz 被压缩文件 解压: tar -zxvf 被解压文件 具体的可以在linux环境下 用 tar --help 查看详细说明格式:ta ...