题目链接:

  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 ;
}

最新文章

  1. ubuntu如何安装nodejs最新版 本
  2. LANDR:在线母带处理
  3. PHP 常用函数库和一些实用小技巧
  4. 微博一键分享主要通过对指定 URL 添加各种参数来实现;
  5. Common Linux log files name and usage--reference
  6. 安装grid之前检查配置 ,报错如下
  7. 容器 MAP
  8. 六行代码获取本地IP
  9. java 读取URL中的资源
  10. BAT54C 二极管是如何工作的?
  11. 使用sftp操作文件并添加事务管理
  12. jquery引入
  13. P4145 上帝造题的七分钟2 / 花神游历各国
  14. Hive 数据类型
  15. 【Linux】常见Linux默认的shell
  16. Wireshark过滤总结
  17. pyCharm最新2017激活码
  18. 我与GitHub的第一次——自制音乐文件修改器
  19. Android基础总结(四)网络通信
  20. Uncaught TypeError: Cannot read property 'decimalSeparator' of undefined

热门文章

  1. TDBXJSONStream(BERLIN新增)的使用
  2. 【APUE】进程间通信之信号量
  3. 【APUE】线程与信号
  4. 编程基础知识——Java JNI开发流程(2)
  5. 【转】如何查看Oracle客户端版本及位数(Windows系统)
  6. QC ALM 11创建域、项目和用户
  7. linux-shell脚本命令之awk
  8. leetCode 81.Search in Rotated Sorted Array II (旋转数组的搜索II) 解题思路和方法
  9. api多版本方案(URL)
  10. myeclipse提示:Syntax error on tokens, delete these tokens怎么解决