传送门

题意:有nnn个球和mmm个筐,每个筐最多放333个球,每个球只能放入特定的一些筐中,在题中给出。构造一种放球的方案使得nnn个球都被放在某个筐中且 球的个数不超过111 的筐的数量尽量大。

m≤100,n≤3mm\leq 100,n\leq 3mm≤100,n≤3m

把每个筐拆成 333 个点,并每个筐的三个点两两之间连边。

每个球和可以放的筐的三个点都连上边。

然后跑一般图最大匹配。

这样如果一个筐的333个点被匹配的点不超过111,可以找两个点自己匹配。

而每个球都可以且必须找一个匹配,所以最终答案是最大匹配−n最大匹配-n最大匹配−n

一个很坑的地方,最大匹配的时候球不一定都有匹配,输出方案时会出锅。解决方法是先从球开始增广,这样每个球先找到匹配点,这样最后一定有匹配。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cctype>
#include <queue>
#include <cassert>
#define MAXN 1005
#define MAXM 1000005
using namespace std;
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
struct edge{int u,v;}e[MAXM];
int head[MAXN],nxt[MAXM],cnt;
void addnode(int u,int v)
{e[++cnt]=(edge){u,v};nxt[cnt]=head[u];head[u]=cnt;
}
inline void insert(int u,int v){addnode(u,v),addnode(v,u);}
int mat[MAXN],pre[MAXN],col[MAXN],fa[MAXN],N;
int idx[MAXN],tot;
int find(const int& x){return fa[x]==x? x:fa[x]=find(fa[x]);}
queue<int> q;
inline int lca(int x,int y)
{for (++tot;;swap(x,y))if (x){x=find(x);if (idx[x]==tot) return x;idx[x]=tot,x=pre[mat[x]];}
}
inline void shrink(int x,int y,int l)
{while (find(x)!=l){pre[x]=y,y=mat[x];if (col[y]==2) col[y]=1,q.push(y);if (x==find(x)) fa[x]=l;if (y==find(y)) fa[y]=l;x=pre[y];}
}
inline int bfs(int s)
{for (int i=1;i<=N;i++) pre[i]=col[i]=0,fa[i]=i;col[s]=1;while (!q.empty()) q.pop();q.push(s);while (!q.empty()){int u=q.front();q.pop();for (int i=head[u];i;i=nxt[i]){int v=e[i].v;if (find(u)==find(v)||col[v]==2) continue;if (!col[v]){col[v]=2,pre[v]=u;if (!mat[v]){for (int las;v;v=las)las=mat[pre[v]],mat[v]=pre[v],mat[pre[v]]=v;return 1;}col[mat[v]]=1,q.push(mat[v]);}else{int l=lca(u,v);shrink(u,v,l),shrink(v,u,l);}}}return 0;
}
int main()
{for (int T=read();T;T--){memset(head,0,sizeof(head));memset(nxt,0,sizeof(nxt));cnt=0;memset(mat,0,sizeof(mat));tot=0;memset(idx,0,sizeof(idx));int n,m,e;n=read(),m=read(),e=read();N=3*m+n;for (int i=1;i<=m;i++) insert(i,i+m),insert(i,i+2*m),insert(i+m,i+2*m);for (int i=1;i<=e;i++){int v,u;v=read(),u=read();insert(3*m+v,u);insert(3*m+v,u+m);insert(3*m+v,u+2*m);}int ans=0;for (int i=N;i>=1;i--)if (!mat[i])ans+=bfs(i);printf("%d\n",ans-n);for (int i=3*m+1;i<=N;i++) printf("%d%c",(mat[i]-1)%m+1," \n"[i==N]);}return 0;
}

【WC2016】挑战NPC 【带花树】【建图】相关推荐

  1. luogu P4258 [WC2016]挑战NPC(一般图的最大匹配,带花树,建图、拆点技巧)

    整理的算法模板合集: ACM模板 luogu P4258 [WC2016]挑战NPC 如果是一堆球一堆筐,每一个筐里只能放一个球,求最大能放多少个球, 那么就是一个二分图的最大匹配问题,非常简单,我们 ...

  2. WC2016 挑战NPC

    NPC,即Non_Player Character,作为游戏很重要的一种存在-- 哎不对,扯远了. 这题出题人卖萌,明显不是NPC问题. 我们可以发现(通过前几个点找一找规律什么的)这题可以建立一个一 ...

  3. 带花树[一般图最大匹配模板]

    在这里插入代码片const int maxn=1005; const int maxm=1e6+5;struct daihuashu {struct edge {int v,nxt;} e[maxm] ...

  4. 牛客2021年七夕节比赛 F 清楚姐姐的翅膀们【带花树】

    传送门 清 楚 姐 姐 的 后 宫 有 很 多 妹 子 , 她 们 都 是 清 楚 姐 姐 的 翅 膀 . 当时觉得是匹配,就狂交了六十多发随机 题意: N N N个妹子, M M M个蝴蝶结 每个蝴 ...

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

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

  6. P4258-[WC2016]挑战NPC【带花树】

    正题 题目链接:https://www.luogu.com.cn/problem/P4258 题目大意 给出nnn个球,mmm个篮筐,每个球都可以被放入一些特定的篮筐,每个球都要放,要求球的个数小于等 ...

  7. 模板 - 一般图最大匹配(带花树)

    整理的算法模板合集: ACM模板 目录 题目描述 给出一张 n 个点 m 条边的无向图,求该图的最大匹配. 总结一下带花树算法的流程 1.每次找一个未匹配的点出来增广 2.在增广过程中,如果相邻点是白 ...

  8. luogu P6113 【模板】一般图最大匹配(带花树)

    整理的算法模板合集: ACM模板 总结一下带花树算法的流程 1.每次找一个未匹配的点出来增广 2.在增广过程中,如果相邻点是白点,或者是同一朵花中的节点,则直接跳过这个点 3.如果相邻点是一个未被匹配 ...

  9. 【学习小记】一般图最大匹配——带花树算法

    Text 一般图的最大匹配仍然是基于寻找增广路的 增广路的定义是这样的一条路径,它不经过重复的点,并且路径两端均没有匹配,且整条路径是非匹配边-匹配边-非匹配边这样交错的. 类比二分图最大匹配的增广路 ...

  10. URAL - 1099 Work Scheduling(一般图最大匹配-带花树模板)

    题目链接:点击查看 题目大意:给出n个警卫,接下来给出数个关系,表示两个警卫可以互相配合,现在规定只有可以互相配合的警卫才能留下来继续工作,问最多能有多少个警卫留下来工作,输出匹配方案 题目分析:一般 ...

最新文章

  1. Yann LeCun“隔纸对话”黄铁军:图灵机上的深度学习能模拟世界吗?
  2. 【原创】大数据基础之Ambari(1)简介、编译安装、使用
  3. 6万人同时离场,竟然一点都不挤?原来用了这个神器
  4. 关于Linux服务器改变为普通用户进行运维的操作手记
  5. [教程]微信官方开源UI库-WeUI使用方法【申明:来源于网络】
  6. 汇编三星题目:一个有符号字数组以0为结束标志,编程求这个数组的最大值、 最小值、平均值
  7. 三维实景建模技术的应用
  8. 百度 bos php,百度BOS云存储上传插件 - 支持客户端直传、服务端中转、分片上传 – 基于ThinkPHP和Bootstrap的极速后台开发框架...
  9. 靶机渗透练习99-hacksudo:FOG
  10. gprs数据传输流程
  11. 这套表情包,居然开源了!!
  12. 证件照换底色的2个简单方法分享
  13. 简易的记账软件设计与实现
  14. html5+css3---元素样式+选择器
  15. 腾讯云服务器是独立IP吗?独立IP有什么好处?
  16. Java(计算机底层——二进制到汇编)(先导课)
  17. mysql MaxScale
  18. 【Vivado使用误区与进阶】XDC约束技巧之时钟篇
  19. 游戏开发中的新兴技术
  20. excel人事必学合同到期提醒

热门文章

  1. 交友软件上的两种网友类型......
  2. 史上最难高考数学,全国平均26分...
  3. 是的,我打败了一个奥特曼。
  4. 这相册一出手,哪个长辈搞不定?
  5. 程序员年入50万,我们该如何努力达到这个目标?
  6. 10G 职场晋升/IT干货/生活技能/理财秘籍 【全套】学习资料免费送!
  7. 程序员的项目周期(表情包版)
  8. solr 配置mysql数据源_solr data-config.xml配置文件的见解mysql数据源
  9. java main 声明_Java中main方面面试题
  10. powerpc-linux-gcc,关于powerpc-linux-uclibc-gcc的使用