Hdu 5352 MZL's City (多重匹配)
2024-08-30 08:06:51
题目链接:
题目描述:
有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 ;
}
最新文章
- ubuntu如何安装nodejs最新版 本
- LANDR:在线母带处理
- PHP 常用函数库和一些实用小技巧
- 微博一键分享主要通过对指定 URL 添加各种参数来实现;
- Common Linux log files name and usage--reference
- 安装grid之前检查配置 ,报错如下
- 容器 MAP
- 六行代码获取本地IP
- java 读取URL中的资源
- BAT54C 二极管是如何工作的?
- 使用sftp操作文件并添加事务管理
- jquery引入
- P4145 上帝造题的七分钟2 / 花神游历各国
- Hive 数据类型
- 【Linux】常见Linux默认的shell
- Wireshark过滤总结
- pyCharm最新2017激活码
- 我与GitHub的第一次——自制音乐文件修改器
- Android基础总结(四)网络通信
- Uncaught TypeError: Cannot read property 'decimalSeparator' of undefined
热门文章
- TDBXJSONStream(BERLIN新增)的使用
- 【APUE】进程间通信之信号量
- 【APUE】线程与信号
- 编程基础知识——Java JNI开发流程(2)
- 【转】如何查看Oracle客户端版本及位数(Windows系统)
- QC ALM 11创建域、项目和用户
- linux-shell脚本命令之awk
- leetCode 81.Search in Rotated Sorted Array II (旋转数组的搜索II) 解题思路和方法
- api多版本方案(URL)
- myeclipse提示:Syntax error on tokens, delete these tokens怎么解决