「WC2016」挑战NPC

解题思路

这个题建图非常厉害,带花树什么的只会口胡根本写不动,所以我写了机房某大佬教我的乱搞。

考虑把一个筐 \(x\) 拆成 \(x1,x2,x3\) 三个点,且这三个点相互连边,每对球和筐的连边都让球和筐拆出的三个点连边,这样如果筐内部的点存在一个匹配,那么这个筐就是半空的,所以我们需要先将球匹配完,然后不断尝试增广来自筐的点,每一次成功增广都使得答案 \(+1\) ,一般图最大匹配跑跑就好了。

下面的代码随时可能在 \(\text{uoj}\) 上变成 \(\text{97pts}\) 。

code

/*program by mangoyang*/
#include<bits/stdc++.h>
#define inf (0x7f7f7f7f)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
int ch = 0, f = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
if(f) x = -x;
}
const int N = 100005;
vector<int> g[N];
int a[N], b[N], vis[N], mat[N], tim, n, m, e, ans;
inline int dfs(int u){
if(!u) return 1; vis[u] = tim;
random_shuffle(g[u].begin(), g[u].end());
for(int i = 0; i < (int) g[u].size(); i++){
int v = g[u][i], x = mat[v];
if(vis[x] == tim) continue;
mat[u] = v, mat[v] = u, mat[x] = 0;
if(dfs(x)) return 1;
mat[u] = 0, mat[x] = v, mat[v] = x;
}
return 0;
}
inline void XJB_blossom(){
int tot1 = 0, tot2 = 0;
for(int i = 1; i <= n; i++) a[++tot1] = i;
for(int i = n + 1; i <= n + 3 * m; i++) b[++tot2] = i;
for(int T = 1; T <= 20; T++){
random_shuffle(a + 1, a + tot1 + 1), ++tim;
for(int i = 1; i <= tot1; i++)
if(!mat[a[i]]) ans += dfs(a[i]);
}
for(int T = 1; T <= 20; T++){
random_shuffle(b + 1, b + tot2 + 1), ++tim;
for(int i = 1; i <= tot2; i++)
if(!mat[b[i]]) ans += dfs(b[i]);
}
}
inline void addedge(int x, int y){
g[x].push_back(y), g[y].push_back(x);
}
inline void solve(){
read(n), read(m), read(e), tim = ans = 0;
for(int i = 1; i <= m; i++){
addedge(n + (i - 1) * 3 + 1, n + (i - 1) * 3 + 2);
addedge(n + (i - 1) * 3 + 1, n + (i - 1) * 3 + 3);
addedge(n + (i - 1) * 3 + 2, n + (i - 1) * 3 + 3);
}
for(int i = 1, x, y; i <= e; i++){
read(x), read(y);
addedge(x, n + (y - 1) * 3 + 1);
addedge(x, n + (y - 1) * 3 + 2);
addedge(x, n + (y - 1) * 3 + 3);
}
XJB_blossom();
cout << ans - n << endl;
for(int i = 1; i <= n; i++)
printf("%d ", (mat[i] - n - 1) / 3 + 1);
for(int i = 1; i <= n + 3 * m; i++)
vis[i] = mat[i] = 0, g[i].clear();
}
int main(){
srand(time(NULL));
int T; read(T); while(T--) solve();
return 0;
}

「WC2016」挑战NPC的更多相关文章

  1. 【BZOJ4405】【WC2016】挑战NPC(带花树)

    [BZOJ4405][WC2016]挑战NPC(带花树) 题面 BZOJ 洛谷 Uoj Description 小N最近在研究NP完全问题,小O看小N研究得热火朝天,便给他出了一道这样的题目: 有n个 ...

  2. 「WC2016」论战捆竹竿

    「WC2016」论战捆竹竿 前置知识 参考资料:<论战捆竹竿解题报告-王鉴浩>,<字符串算法选讲-金策>. Border&Period 若前缀 \(pre(s,x)​\ ...

  3. UOJ171 【WC2016】挑战NPC

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  4. UOJ 171 【WC2016】挑战NPC

    一开始还真没想到是一般图匹配这种模型(毕竟才会的带花树) 把每一个盒子拆成3个,每一个可以放置进它的小球分别向这三个点连边,然后这三个点在连成一个三元环,最终答案就是小球数目-匹配数. 由于是一般图, ...

  5. 【刷题】UOJ #171 【WC2016】挑战NPC

    小 N 最近在研究 NP 完全问题,小 O 看小 N 研究得热火朝天,便给他出了一道这样的题目: 有 \(n\) 个球,用整数 \(1\) 到 \(n\) 编号.还有 \(m\) 个筐子,用整数 \( ...

  6. 「SDOI2009」Bill的挑战

    「SDOI2009」Bill的挑战 传送门 状压 \(\text{DP}\) 瞄一眼数据范围 \(N\le15\),考虑状压. 设 \(f[i][j]\) 表示在所有串中匹配到第 \(i\) 位字符且 ...

  7. [WC2016]挑战NPC(一般图最大匹配)

    [WC2016]挑战NPC(一般图最大匹配) Luogu 题解时间 思路十分有趣. 考虑一个筐只有不多于一个球才有1的贡献代表什么. 很明显等效于有至少两个位置没有被匹配时有1的贡献. 进而可以构造如 ...

  8. Linux 小知识翻译 - 「Linux」和「发行版」之间的关系

    「Linux」本来指的仅仅是内核.5年之前大多都是这么认为的,但是最近不这么说了. 最近一般都说「Linux」是个 OS,这里的OS,不仅仅是内核,而是指电脑的整体环境(除了内核,还包括一些外围的软件 ...

  9. 不设目标也能通关「马里奥」的AI算法,全靠好奇心学习

    在强化学习中,设计密集.定义良好的外部奖励是很困难的,并且通常不可扩展.通常增加内部奖励可以作为对此限制的补偿,OpenAI.CMU 在本研究中更近一步,提出了完全靠内部奖励即好奇心来训练智能体的方法 ...

随机推荐

  1. python概念-其实只要简单了解一下,但是却讲了将近两个小时的知识点:元类

    说实话,我真心不太想总结这个东西,算了,炒一下egon的吧 1 引子 1 class Foo: 2 pass 3 4 f1=Foo() #f1是通过Foo类实例化的对象 python中一切皆是对象,类 ...

  2. Python练习-无参装饰器的正确打开方式

    import time def DecoUserPrint(UserFunc):#定义一个DecoUserPrint接收参数的多重方法 def DecoPrint(): StartTime = tim ...

  3. Understanding the Space Used by ZFS -- (转)

    Understanding the Space Used by ZFS By Brian Leonard on Sep 28, 2010 Until recently, I've been confu ...

  4. 【Tomcat】Tomcat配置与优化(内存、并发、管理)【自己配置】

    一.JVM内存配置优化 主要通过以下的几个jvm参数来设置堆内存的: -Xmx512m 最大总堆内存,一般设置为物理内存的1/4 -Xms512m 初始总堆内存,一般将它设置的和最大堆内存一样大,这样 ...

  5. zookeeper集群查看状态时报错Error contacting service. It is probably not running的一些坑以及解决办法

    最近在搭建mq集群时候需要用到,zookeeper,可是启动的时候显示成功了,查看状态的时候却报错了: 碰到这个问题也是研究好好半天才解决,这里就总结出一个快速解决办法! 首先,必须看日志: 报错信息 ...

  6. ubuntu使用百度云盘插件

    Firefox 插件地址 https://addons.mozilla.org/zh-CN/firefox/addon/baidu-pan-exporter/ 安装后重启Firefox,然后百度云下载 ...

  7. haproxy支持的负载均衡算法详解

    目前haproxy支持的负载均衡算法有如下8种: 1.roundrobin 表示简单的轮询,每个服务器根据权重轮流使用,在服务器的处理时间平均分配的情况下这是最流畅和公平的算法.该算法是动态的,对于实 ...

  8. 数据库-mysql安装

    MySQL 安装 所有平台的Mysql下载地址为: MySQL 下载. 挑选你需要的 MySQL Community Server 版本及对应的平台. Linux/UNIX上安装Mysql Linux ...

  9. 学习总结——JMeter做http接口功能测试

    JMeter对各种类型接口的测试 默认做接口测试前,已经给出明确的接口文档(如,http://test.nnzhp.cn/wiki/index.php?doc-view-59):本地配好了JMeter ...

  10. HOG目标检测

    用HOG进行行人检测时,需要用训练好的支持向量机来对图片进行分类,在opencv中,支持向量机已经训练好,但自己来训练支持向量机才能更好的体会这一过程. 参考:http://blog.csdn.net ...