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 题目大意: 给你各个人可以属于的组,把这些人分组,使这些组中人数最多的组人数最少,并输出这个人数 ...
随机推荐
- Arcgis栅格时序地图制作---时间轴动态展示多期影像
转自原文 Arcgis栅格时序地图制作---时间轴动态展示多期影像 效果如何???满意您go on,不满意咱 say goodbye··· 题外话: 为了在这里动态展示下制作结果,也是费了老劲了,转换 ...
- linux是类unix操作系统
linux是类unix操作系统,linux与unix使用的基础命令是一样的,没有区别.Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程 ...
- 负载均衡之基于DNS负载
基于DNS的负载平衡 OK,在了解了负载平衡系统的大致组成及使用方式之后.我们就来看看各种负载解决方式. 当前业界中所最常使用的负载平衡解决方式主要分为三种:基于DNS的负载平衡,L3/4负载平衡,也 ...
- Office WORD如何取消开始工作右侧栏
工具-选项-视图,取消勾选"启动任务窗格"
- #include<> 和 #include""的区别
#include< file >编译程序会先到标准函数库中找文件 #include”file” 编译程序会先从当前目录中找文件 参考原文 转: 在C程序中包含文件有以下两种方法: (1)用 ...
- Android 常用Shell命令
1.查询模拟器/设备实例 adb devices 2.从模拟器/设备中拷入或拷出文件(默认拷贝在执行目录) 从模拟器或者设备中复制文件或目录,使用(如下命): adb pull <remote& ...
- sshclientCRT连接linux使用技巧
设置仿真和回滚缓冲区 字体外观设置 日志文件设置 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fi ...
- mysql命令行爱好者必备工具mycli
mycli MyCLI is a command line interface for MySQL, MariaDB, and Percona with auto-completion and syn ...
- Oracle - 查询语句 - 分组函数
/* 分组函数 不能再select子句中出现普通的列,除非这个列在group by中给出 所有的空值都会被分为一组 分组过滤 SELECT FROM WHERE GROUPBY HAVING ORDE ...
- YTU 2428: C语言习题 计算该日在本年中是第几天
2428: C语言习题 计算该日在本年中是第几天 时间限制: 1 Sec 内存限制: 128 MB 提交: 1505 解决: 857 题目描述 定义一个结构体变量(包括年.月.日).编写一个函数d ...