「WC2016」挑战NPC
「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的更多相关文章
- 【BZOJ4405】【WC2016】挑战NPC(带花树)
[BZOJ4405][WC2016]挑战NPC(带花树) 题面 BZOJ 洛谷 Uoj Description 小N最近在研究NP完全问题,小O看小N研究得热火朝天,便给他出了一道这样的题目: 有n个 ...
- 「WC2016」论战捆竹竿
「WC2016」论战捆竹竿 前置知识 参考资料:<论战捆竹竿解题报告-王鉴浩>,<字符串算法选讲-金策>. Border&Period 若前缀 \(pre(s,x)\ ...
- UOJ171 【WC2016】挑战NPC
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- UOJ 171 【WC2016】挑战NPC
一开始还真没想到是一般图匹配这种模型(毕竟才会的带花树) 把每一个盒子拆成3个,每一个可以放置进它的小球分别向这三个点连边,然后这三个点在连成一个三元环,最终答案就是小球数目-匹配数. 由于是一般图, ...
- 【刷题】UOJ #171 【WC2016】挑战NPC
小 N 最近在研究 NP 完全问题,小 O 看小 N 研究得热火朝天,便给他出了一道这样的题目: 有 \(n\) 个球,用整数 \(1\) 到 \(n\) 编号.还有 \(m\) 个筐子,用整数 \( ...
- 「SDOI2009」Bill的挑战
「SDOI2009」Bill的挑战 传送门 状压 \(\text{DP}\) 瞄一眼数据范围 \(N\le15\),考虑状压. 设 \(f[i][j]\) 表示在所有串中匹配到第 \(i\) 位字符且 ...
- [WC2016]挑战NPC(一般图最大匹配)
[WC2016]挑战NPC(一般图最大匹配) Luogu 题解时间 思路十分有趣. 考虑一个筐只有不多于一个球才有1的贡献代表什么. 很明显等效于有至少两个位置没有被匹配时有1的贡献. 进而可以构造如 ...
- Linux 小知识翻译 - 「Linux」和「发行版」之间的关系
「Linux」本来指的仅仅是内核.5年之前大多都是这么认为的,但是最近不这么说了. 最近一般都说「Linux」是个 OS,这里的OS,不仅仅是内核,而是指电脑的整体环境(除了内核,还包括一些外围的软件 ...
- 不设目标也能通关「马里奥」的AI算法,全靠好奇心学习
在强化学习中,设计密集.定义良好的外部奖励是很困难的,并且通常不可扩展.通常增加内部奖励可以作为对此限制的补偿,OpenAI.CMU 在本研究中更近一步,提出了完全靠内部奖励即好奇心来训练智能体的方法 ...
随机推荐
- 利用phpMyAdmin提权
利用phpMyAdmin提权 发表于 2016-03-31 | 分类于 phpMyAdmin | 暂无评论 | 9次阅读 爆路径 /phpmyadmin/libraries/lec ...
- 查看Linux系统版本的几种方法
第一种: cat /etc/os-release # 或者 cat /etc/redhat-release 结果如下: NAME="Ubuntu" VERSION="16 ...
- UNIX环境高级编程 第13章 守护进程
守护进程daemon是一种生存周期很长的进程.它们通常在系统引导时启动,在系统关闭时终止.守护进程是没有终端的,它们一直在后台运行. 守护进程的特征 在Linux系统中,可以通过命令 ps -efj ...
- linux挂载光盘
1.找到光盘的位置 ls -l /dev |grep cdrom mount /dev/sr0 /mnt [root@node2 /]# ls -l /dev |grep cdrom lrwxrwx ...
- [MySQL FAQ]系列 — EXPLAIN结果中哪些信息要引起关注
我们使用EXPLAIN解析SQL执行计划时,如果有下面几种情况,就需要特别关注下了: 首先看下 type 这列的结果,如果有类型是 ALL 时,表示预计会进行全表扫描(full table scan) ...
- ajax.BeginForm异步提交表单并显示更新数据
view代码: <!--基本信息模块--> 2 <div class="profile_box" id="basicInfo"> 3 & ...
- 经典面试题:js继承方式上
js不是传统的面向对象语言,那么他是怎么实现继承的呢?由于js是基于原型链实现的面向对象,所以js主要通过原型链查找来实现继承,主要有两大类实现方式,分为基于构造函数的继承,以及非构造函数的继承. 由 ...
- 洛谷P1411 砝码称重
传送门啦 这个题总体思路就是先搜索在 $ dp $ void dfs(int keep,int now){ //使用 放弃 if(now > m) return; //已经放弃超过m个了,就退出 ...
- django 建立一个简单的应用
本人的用的版本是python 2.7.3和django 1.10.5,Windows10系统 1.首先通过命令建立项目和app 找到django的安装路径,我的路径是:C:\Python27\Lib\ ...
- C# TabControl 隐藏标签头(TabControl Hide Head)
TabControl控件,有时候需要动态显示一个或者多个标签页,如果只是显示一个标签页的时候不想显示标签头,所以有可能隐藏头部的需求. 如下代码可以实现 public Form1() { Initia ...