HDU 4685
题意略。
思路:
本题和POJ1904颇为相似,只是那个最大匹配没有现成的,要我们自己求出来。并且要给每一个单身的王子/公主现找一个虚拟的对象。
这也是合乎情理的,王子每一次换一个公主时,可能会导致某一个王子失去他的原配,然而同样也会有另一个单身王子找到公主。
这里注意,每一个虚拟王子要喜欢所有公主,每一个虚拟公主要被所有王子喜欢。
详见代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = ; int linked[maxn],component[maxn],V,uN,n,m;
bool used[maxn],visit[maxn];
vector<int> store[maxn];
vector<int> G[maxn];
vector<int> rG[maxn];
vector<int> graph[maxn];
vector<int> vs; void add_edge(int from,int to){
G[from].push_back(to);
rG[to].push_back(from);
}
void dfs(int v){
used[v] = true;
for(int i = ;i < G[v].size();++i){
int to = G[v][i];
if(!used[to]) dfs(to);
}
vs.push_back(v);
}
void rdfs(int v,int k){
used[v] = true;
component[v] = k;
for(int i = ;i < rG[v].size();++i){
int to = rG[v][i];
if(!used[to]) rdfs(to,k);
}
}
int scc(){
memset(used,false,sizeof(used));
vs.clear();
for(int v = ;v <= V;++v){
if(!used[v]) dfs(v);
}
memset(used,false,sizeof(used));
int k = ;
for(int i = vs.size() - ;i >= ;--i){
if(!used[vs[i]]) rdfs(vs[i],k++);
}
return k;
}
bool dfs1(int u){
for(int i = ;i < graph[u].size();++i){
int v = graph[u][i];
if(used[v]) continue;
used[v] = true;
if(linked[v] == - || dfs1(linked[v])){
linked[v] = u;
return true;
}
}
return false;
}
int hungary(){
int ret = ;
memset(linked,-,sizeof(linked));
for(int u = ;u <= uN;++u){
memset(used,false,sizeof(used));
if(dfs1(u)) ++ret;
}
return ret;
}
void init(){
memset(component,,sizeof(component));
memset(visit,false,sizeof(visit));
for(int i = ;i < maxn;++i){
G[i].clear();
rG[i].clear();
store[i].clear();
graph[i].clear();
}
uN = n;
} int main(){
int T,cas = ;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
init();
for(int i = ;i <= n;++i){
int ki;
scanf("%d",&ki);
int t;
for(int j = ;j < ki;++j){
scanf("%d",&t);
graph[i].push_back(t);
add_edge(i,t + n);
}
}
int temp = hungary();
int tn = n - temp,tm = m - temp;
for(int i = ;i <= m;++i){
int from = i + n,to = linked[i];
if(to == -) continue;
add_edge(from,to);
visit[to] = true;
}
for(int i = n + m + ;i <= n + m + tm;++i){
bool signal = true;
for(int j = n + ;j <= n + m;++j){
add_edge(i,j);
if(signal && linked[j - n] == -){
signal = false;
add_edge(j,i);
linked[j - n] = i;
}
}
}
for(int i = n + m + tm + ;i <= n + m + tm + tn;++i){
bool signal = true;
for(int j = ;j <= n;++j){
add_edge(j,i);
if(visit[j] == false && signal){
signal = false;
visit[j] = true;
add_edge(i,j);
}
}
}
V = n + m + tm + tn;
int numb = scc();
for(int i = ;i <= n;++i){
for(int j = ;j < graph[i].size();++j){
int to = graph[i][j] + n;
if(to > n + m) continue;
int belong1 = component[i],
belong2 = component[to];
if(belong1 == belong2){
store[i].push_back(to - n);
}
}
sort(store[i].begin(),store[i].end());
}
printf("Case #%d:\n",cas++);
for(int i = ;i <= n;++i){
printf("%d",store[i].size());
for(int j = ;j < store[i].size();++j){
printf(" %d",store[i][j]);
}
printf("\n");
}
}
return ;
}
HDU 4685的更多相关文章
- POJ 1904 HDU 4685
这两道题差不多,POJ这道我很久以前就做过,但是比赛的时候居然没想起来.. POJ 这道题的题意是,N个王子每个人都有喜欢的公主,当他们选定一个公主结婚时,必须是的剩下的人也能找到他喜欢的公主结婚. ...
- hdu 4685 二分匹配+强连通分量
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4685 题解: 这一题是poj 1904的加强版,poj 1904王子和公主的人数是一样多的,并且给出 ...
- HDU 4685 Prince and Princess(二分图+强连通分量)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4685 题意:给出n个王子和m个公主.每个王子有一些自己喜欢的公主可以匹配.设最大匹配为M.那么对于每个 ...
- hdu 4685(强连通分量+二分图)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4685 题意:n个王子和m个公主,王子只能和他喜欢的公主结婚,公主可以和所有的王子结婚,输出所有王子可能 ...
- HDU 4685 Prince and Princess 二分图匹配+tarjan
Prince and Princess 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4685 Description There are n pri ...
- hdu 4685(匹配+强连通分量)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4685 思路:想了好久,终于想明白了,懒得写了,直接copy大牛的思路了,写的非常好! 做法是先求一次最 ...
- hdu 4685(强连通分量+二分图的完美匹配)
传送门:Problem 4685 https://www.cnblogs.com/violet-acmer/p/9739990.html 参考资料: [1]:二分图的最大匹配.完美匹配和匈牙利算法 [ ...
- hdu 4685 简单匹配+Tarjan算法
思路:首先看到这题以为能用poj1904的模版直接A掉,WA了几次,然后又TLE了几次.还是想到了正解. 一开始我想的大致方向已经是对的了.先是由王子向每个喜欢的公主建边,再求一次最大匹配,找出匹配后 ...
- H - Prince and Princess - HDU 4685(二分匹配+强连通分量)
题意:有N个王子M个公主,王子喜欢一些公主,而且只能是王子喜欢的人,他们才可以结婚,现在让他们尽可能多的结婚的前提下找出来每个王子都可以和谁结婚. 分析:先求出来他们的最大匹配,因为给的数据未必是完备 ...
- hdu 4685 Prince and Princess(匈牙利算法 连通分量)
看了别人的题解.须要用到匈牙利算法的强连通算法 #include<cstdio> #include<algorithm> #include<vector> #pra ...
随机推荐
- Pytest进阶之参数化
前言 unittest单元测试框架使用DDT进行数据驱动测试,那么身为功能更加强大且更加灵活的Pytest框架怎么可能没有数据驱动的概念呢?其实Pytest是使用@pytest.mark.parame ...
- WPF 动态添加按钮以及样式字典的引用(Style introduction)
我们想要达到的结果是,绑定多个Checkbox然后我们还可以获取它是否被选中,其实很简单,我们只要找到那几个关键的对象就可以了. 下面是Ui,其中定义了一个WrapPanel来存放CheckBox,还 ...
- 基于ReentrantLock的非公平锁理解AQS
AQS AQS概述 AbstractQueuedSynchronizer抽象队列同步器简称AQS,它是实现同步器的基础组件,juc下面Lock的实现以及一些并发工具类就是通过AQS来实现的,这里我 ...
- Python实现淘宝秒杀聚划算自动提醒源码
快来加入群[python爬虫交流群](群号570070796),发现精彩内容. 本实例能够监控聚划算的抢购按钮,在聚划算整点聚的时间到达时发出提醒(音频文件自己定义位置)并自动弹开页面(URL自己定义 ...
- 前端笔记之React(五)Redux深入浅出
一.Redux整体感知 Redux是JavaScript状态管理容器,提供了可被预测状态的状态管理容器.来自于Flux思想,Facebook基于Flux思想,在2015年推出Redux库. 中文网站: ...
- 使用eclipse编写和运行java程序(基础)
1.首先java程序的运行你需要下载和安装JDK,这是java运行的必备环境. 2.在桌面上找到eclipes,双击打开. 3.在eclipes启动的过程中,会弹出一个窗口,让你填写java工作区的保 ...
- Java虚拟机学习笔记(一)之初识
一:特定 跨平台性.安全性.可移植性. 二:体系机构 Java 体系结构包括四个独立但相关的技术: Java程序设计语言 Java Class文件格式 Java 应用编程接口(API) Java 虚拟 ...
- 今天代码中接触到了一个新的东西。js的上下自动滚动,无缝对接。
js的上下自动滚动,无缝对接.为什么会用到这个东西呢?因为我在做公司的官网项目的修改的时候.有一个产品介绍的页面,会有很多的产品出现在,中间部分的列表里.但是又不能够使用分页.所以我就在想如果,列表数 ...
- 一次简单的SQL手工注入
1. 首先要了解SQL注入的原理: SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 具体来说,它是利 ...
- Eclipse 连接不上 hadoop 的解决办法
先说一下我的情况,集群的 hadoop 是 1.0.4 ,之后在虚拟机上搭建了最新稳定版 1.2.1 之后,Eclipse 插件始终连接不上. 出现 Error: Call to 192.168.1. ...