Hdu 5352 MZL's City (多重匹配)
题目链接:
题目描述:
有n各节点,m个操作。刚开始的时候节点都是相互独立的,一共有三种操作:
1:把所有和x在一个连通块内的未重建过的点全部重建。
2:建立一条双向路(x,y)
3:又发生了地震,p条路被毁。
问最后最多有多少个节点被重建,输出重建节点的最小字典序。
解题思路:
这几天正好在学匹配,但是昨天下午还是没有看出来这个是匹配题目。看了题解扪心自问了自己三次,是不是傻。就是把每个需要重建的节点x拆成k个点,然后对每个拆分后的点和与拆点在同一连通块里面的点建边,然后按照倒序进行匹配,保证字典序最大。
但是匹配好像要比网络流慢好多,改天还是去学一下新姿势的好。
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = ;
const int N = *;
vector <int> G[N];
int ans[maxn*], p[maxn], used[maxn], vis[maxn];
int n, m, k, num, nu, maps[maxn][maxn];
void dfs (int u)
{//求连通块内的点
vis[u] = ;
p[num ++] = u;
for (int i=; i<=n; i++)
if (!vis[i] && maps[u][i])
dfs (i);
}
bool Find (int u)
{
for (int i=; i<G[u].size(); i++)
{
int v = G[u][i];
if (!vis[v])
{
vis[v] = ;
if (!used[v] || Find(used[v]))
{
used[v] = u;
return true;
}
}
}
return false;
}
int hungry ()
{
int res = ;
memset (used, , sizeof(used));
for (int i=nu-; i>=; i--)//倒序求最大匹配
for (int j=i*k; j<(i+)*k; j++)
{
memset (vis, , sizeof(vis));
if (Find(j))
{
res ++;
ans[i] ++;
}
}
return res;
}
int main ()
{
int t;
scanf ("%d", &t);
while (t --)
{
scanf ("%d %d %d", &n, &m, &k);
memset (maps, , sizeof(maps));
for (int i=; i<N; i++)
G[i].clear();
nu = ;
while (m --)
{
int type, x, y, z;
scanf ("%d", &type);
if (type == )
{
scanf ("%d", &x);
num = ;
memset (vis, , sizeof(vis));
dfs (x);
for (int i=; i<num; i++)//建边
for (int j=nu*k; j<(nu+)*k; j++)//拆点
G[j].push_back(p[i]);
nu ++;
}
else if (type == )
{
scanf ("%d %d", &x, &y);
maps[x][y] = maps[y][x] = ;
}
else
{
scanf ("%d", &z);
while (z --)
{
scanf ("%d %d", &x, &y);
maps[x][y] = maps[y][x] = ;
}
}
}
memset (ans, , sizeof(ans));
int res = hungry ();
printf ("%d\n", res);
for (int i=; i<nu; i++)
printf ("%d%c", ans[i], i==nu-?'\n':' ');
}
return ;
}
Hdu 5352 MZL's City (多重匹配)的更多相关文章
- HDU 5352——MZL's City——————【二分图多重匹配、拆点||网络流||费用流】
MZL's City Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- HDU 5352 MZL's City (2015 Multi-University Training Contest 5)
题目大意: 一个地方的点和道路在M年前全部被破坏,每年可以有三个操作, 1.把与一个点X一个联通块内的一些点重建,2.连一条边,3.地震震坏一些边,每年最多能重建K个城市,问最多能建多少城市,并输出操 ...
- 2015 Multi-University Training Contest 5 hdu 5352 MZL's City
MZL's City Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- HDU 5352 MZL's City
最小费用最大流,因为要控制字典序,网络流控制不好了...一直WA,所以用了费用流,时间早的费用大,时间晚的费用少. 构图: 建立一个超级源点和超级汇点.超级源点连向1操作,容量为K,费用为COST,然 ...
- hdu 3605 Escape 二分图的多重匹配(匈牙利算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 4000/2000 MS (Java/Others) ...
- HDU 3605 Escape(二分图多重匹配问题)
Escape Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- HDU(3605),二分图多重匹配
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 4000/2000 MS (Java/Others) ...
- hdu 1669(二分+多重匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1669 思路:由于要求minimize the size of the largest group,由此 ...
- HDU 1669 Jamie's Contact Groups(多重匹配+二分枚举)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1669 题目大意: 给你各个人可以属于的组,把这些人分组,使这些组中人数最多的组人数最少,并输出这个人数 ...
随机推荐
- zookeeper的集群部署
1.上传安装包到集群服务器 2.解压 3.修改配置文件 进入zookeeper的安装目录的conf目录 cp zoo_sample.cfg zoo.cfg vi zoo.cfg # The numbe ...
- :>/dev/null 2>&1 的作用
shell中可能经常能看到:>/dev/null 2>&1 命令的结果可以通过%>的形式来定义输出 /dev/null 代表空设备文件 > 代表重定向到哪里,例如:ec ...
- PHP 按位与或 (^ 、&)
今天朋友群里朋友问了下 按位与或的问题.. 按位于主要是对二进制数操作. <?php $a = 1; $b = 2; $c = $a^b; ?> 这里不是单纯的相加关系 十进制 1换算成二 ...
- Codeforces466C Number of Ways
题目链接: http://codeforces.com/problemset/problem/466/C 题意: 给一个长度为n的数组,将其分成连续的三段使三段的和相等.求有几种这种组合 分析: 从头 ...
- C++常用的函数,好的博客文章整理,集锦
http://www.cnblogs.com/xianghang123/archive/2011/08/24/2152404.html c语言产生随机数的方法 http://blog.sina. ...
- Python标准库:内置函数complex([real[, imag]])
本函数能够使用參数real + imag*j方式创建一个复数.也能够转换一个字符串的数字为复数:或者转换一个数字为复数.假设第一个參数是字符串,第二个參数不用填写.会解释这个字符串且返回复数.只是,第 ...
- 第一个WordCount类运行
import java.io.IOException; import java.util.*; import org.apache.hadoop.fs.Path; import org.apache. ...
- egrep grep -E
egrep执行效果与"grep-E" Linux egrep命令用于在文件内查找指定的字符串. egrep执行效果与"grep-E"相似,使用的语法及参数可参照 ...
- 查源码分析 游标 写 需要 cursors 一切不看源码的代码引入都是定时炸弹的启动
https://github.com/PyMySQL/PyMySQL/blob/master/pymysql/__init__.py 建立连接 def Connect(*args, **kwargs) ...
- jsonp突破同源策略,实现跨域訪问请求
版权声明:本文为博主原创文章,未经博主同意不得转载.如需转载请声明:[转自 http://blog.csdn.net/xiaoxian8023 ] https://blog.csdn.net/xiao ...