「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 在本研究中更近一步,提出了完全靠内部奖励即好奇心来训练智能体的方法 ...
随机推荐
- css_清除浮动的4种方式
浮动布局和定位布局为css中布局的常用的两种布局方式,而且兼容性会比较好.随着flex的流行,以后会是主流,新的东西好用,兼容不太好.IE10以下不兼容flex布局. float布局会脱离文档流,对页 ...
- vi 编辑器使用技巧
1.由命令"vi --version"所显示的内容知vi的全局配置文件 2.显示行号 ,非编辑模式输入 : set nu 3.显示颜色 1)在文件中找到 "synta ...
- 查看Oracle数据库中的所有用户名
select username from dba_users"
- 【bzoj题解】1012 最大数
题目描述 现在请求你维护一个数列,要求提供以下两种操作:1.查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2.插入操作.语法:A ...
- 理解mipi协议【转】
转自:http://blog.csdn.net/wanglining1987/article/details/50202615 完成mipi信号通道分配后,需要生成与物理层对接的时序.同步信号: MI ...
- MySQL 5.7.17 Group Relication(组复制)搭建手册【转】
本博文介绍了Group Replication的两种工作模式的架构.并详细介绍了Single-Master Mode的部署过程,以及如何切换到Multi-Master Mode.当然,文末给出了Gro ...
- openjudge-NOI 2.5-1756 八皇后
题目链接:http://noi.openjudge.cn/ch0205/1756/ 题解: 上一道题稍作改动…… #include<cstdio> #include<algorith ...
- spotlight on mysql--安装以及简介
Spotlight on MySQL 安装与配置 第一步: 下载并安装mysql-connector-3.5x Spotlight on MySQL 连接mysql必须使用mysql-connecto ...
- ZK分布式锁(未完 待续)
实现思路 公平锁:创建有序节点,判断本节点是不是序号最小的节点(第一个节点),若是,则获取锁:若不是,则监听比该节点小的那个节点的删除事件. 非公平锁:直接尝试在指定path下创建节点,创建成功,则说 ...
- Hive与HBase区别 大墨垂杨
大墨垂杨 http://www.cnblogs.com/quchunhui/p/5340989.html