挑战NPC 一般图最大匹配

npc问题详解与实例大全 np完全问题所有实例及其证明,非常好的一个文档 立即下载

题意:n个球,放进m个盒子,每个盒子最多放三个球,每个球可以放的盒子是一个集合,半空的盒子是指盒子内的球个数<= 1的盒子。求半空的盒子数目的最大值。

一般图最大匹配。
把每个盒子分成三个,三个间两两连边,每个点向他所能到的盒子的三个分点连边,跑最大匹配,最后的答案就是,maxmatch - n。
这个证明比较容易,但是非常难想,我还需要研究一下这之间的思维过程。

学了一下带花树算法,可能一知半解。
大致思路就是,我们增广的时候,把奇环缩成一个点然后当二分图做,实现的过程利用BFS,寻找奇环,缩点并且扩展新的点。 思路是这样,实现时用并查集实现。

#include <bits/stdc++.h>
using namespace std;

const int N = 666;

int n , m , x , y , mat[N] , pre[N] , fa[N] , ty[N] , e , n2;
bool way[N][N] , inq[N];

void add(int x , int y) {
  way[x][y] = way[y][x] = 1;
}

int getf(int x) {
  return (fa[x] == x) ? x : fa[x] = getf(fa[x]);
}

void init(void) {
  for(int i = 1;i <= n2;++ i) fa[i] = i , pre[i] = ty[i] = 0;
}

bool vis[N];

int LCA(int x , int y) {
  memset(vis , 0 , sizeof(vis));
  for(int i = x;i;i = pre[mat[i]]) i = getf(i) , vis[i] = 1;
  for(int i = y;i;i = pre[mat[i]]) {i = getf(i); if(vis[i]) return i;}
}

queue <int> q;

void shrink(int x , int y , int lca) {
  while(getf(x) != lca) {
    pre[x] = y; y = mat[x];
    if(ty[y] == 2) q.push(y); ty[y] = 1;
    fa[x] = fa[y] = lca;
    x = pre[y];
  }
}

int aug(int x) {
  memset(inq , 0 , sizeof(inq)); init();
  while(!q.empty()) q.pop();
  q.push(x); inq[x] = 1; ty[x] = 1;
  while(!q.empty()) {
    int u  = q.front(); q.pop();
    for(int i = 1;i <= n2;++ i) if(way[u][i]) {
    if(ty[i] == 2 || getf(i) == getf(u)) continue;
    if(!ty[i]) {
      pre[i] = u; ty[i] = 2;
      if(!mat[i]) {
        for(int a = i , la , b;a;a = la) {
          la = pre[a];b = mat[la]; mat[a] = la; mat[la] = a;la = b;
        }
        return 1;
      }
      ty[mat[i]] = 1; q.push(mat[i]); inq[mat[i]] = 1;
    }
    else {
      int lca = LCA(u , i);
      shrink(u , i , lca); shrink(i , u , lca);
    }
      }
  }
  return 0;
}

void onedance(void) {
  memset(mat , 0 , sizeof(mat)); memset(way , 0 , sizeof(way));
  int ans = 0;
  scanf("%d%d%d" , &n , &m , &e);
  n2 = n + 3 * m;
  for(int i = 1;i <= e;++ i) {
    scanf("%d%d" , &x , &y);
    for(int j = 1;j <= 3;++ j) add(x , n + 3 * y - 3 + j);
  }
  for(int i = 1;i <= m;++ i) {
    for(int j = 1;j <= 3;++ j) {
      for(int k = j + 1;k <= 3;++ k) add(n + 3 * i - 3 + j , n + 3 * i - 3 + k);
    }
  }
  for(int i = 1;i <= n2;++ i) if(!mat[i]) ans += aug(i);
  cout << ans - n << endl;
  for(int i = 1;i <= n;++ i) {
    printf("%d " , (mat[i] - n + 3 - 1) / 3);
  }
  puts("");
}

main(void) {
  int t;
  for(scanf("%d" , &t);t --;) {
    onedance();
  }
}
Edge主页被2345劫持?手动清理注册表与组策略的完整方案 浏览器主页劫持是Windows系统中常见的恶意篡改行为,其原理是通过修改注册表、快捷方式、组策略等多处系统配置,强制锁定浏览器启动页。这类劫持不仅影响上网体验,还可能带来隐私泄露和恶意软件感染风险。在安全防护与系统优化场景中,掌握手动清理主页劫持的技能至关重要。本文针对Edge主页被2345导航劫持的问题,深入解析劫持入口,提供从快捷方式、注册表到组策略的逐层清理步骤,并给出防复发策略,帮助用户彻底摆脱顽固劫持。 阅读详情

相关推荐

ABAP FB05 清账实战:POSTING_INTERFACE_CLEARING 核心参数与业务场景解析

本文深入解析ABAP FB05清账操作中的核心函数POSTING_INTERFACE_CLEARING,详细讲解其关键参数与业务场景应用。通过实战案例展示收款清账(EINGZAHL)流程,提供常见错误排查方法,并分享批量清账优化与财务凭证集成的高级技巧,帮助开发者高效处理SAP财务模块清账需求。

weixin_33423874的博客 474

[WC2016]挑战NPC

Sol 这做法我是想不到TATTATTAT 每个筐子拆成三个相互连边 球向三个筐子连边 然后跑一般图最大匹配 这三个筐子间最多有一个匹配 那么显然每个球一定会放在一个筐子里,一定有一个匹配 如果筐子间有匹配,则有一个半空的筐子,因为它一定只匹配了小于等于111个球 答案为匹配数−n−n-n 使答案最大即匹配数最大 上带花树就好了 # include &lt;bits/stdc...

Cyhlnj 414

新手必看:用Simulink搭建飞跨电容三电平逆变器的完整流程(附SPWM配置技巧)

本文详细介绍了使用Simulink搭建飞跨电容三电平逆变器(FCNPC)的完整流程,特别聚焦于SPWM调制策略的配置技巧。通过模块拆解、参数设置和波形优化的三步法,配合实操截图和典型参数表,帮助新手快速掌握多电平逆变器的建模与仿真技能,适用于电力电子学习和项目开发。

weixin_30664051的博客 283

【NPC】13、三维匹配规约到子集和问题

xiazdong 6217

电子结构设计(EMD)十年知识总结

客官,你的面相是做结构设计的奇才~1. 材料选择【一出手的0.1s就败了】2. 钣金件设计【折来折去有啥难】3. 塑胶件设计【看着好复杂】4. 型材件设计【凭啥不让我设计】5. 电子结构(PCBA)设计【静电肿么要我背锅】6. 包装设计【要的就是金玉其外,败絮其中】7. 外观(工业)设计【好不好看,谁说了算】8. 标签设计【】9. 标准件选择【一个螺丝难倒英雄汉/提起螺丝,英雄气短】10. 计算仿...

wfeng86的博客 1569

Windows11上CUDA 12.3配PyTorch踩坑记:一条官网命令救了我的GPU加速

本文详细介绍了在Windows 11上配置CUDA 12.3与PyTorch的完整指南,包括环境准备、安装要点、兼容性解决方案和性能验证。通过官方推荐的conda命令和实用技巧,帮助开发者解决常见问题,实现高效的GPU加速,提升深度学习开发效率。

weixin_42528974的博客 109

[WC2016]挑战NPC (一般图最大匹配----带花树)

题解: 首先所有的球都得装进桶里,所以每个球都向可行的桶连边 一个桶最多可以装3个球,考虑把一个桶拆成三个点 现在要求半空桶的最大数量,如果一个桶只有一个点匹配,那么就cnt++ 但是这样可能会有两个原本可以分开放的点匹配到同一个桶导致答案减小 有一种巧妙的建图方法,可以使能分开放的点尽量分开 把一个桶拆成的三个点两两连边 这样,在求最大匹配的情况下放在一起连的最大匹配数为3,而分开的最大匹配数为4 就可以解决最大化半空桶数的问题 如图:(红色为匹配边) 但是由...

crosnken的博客 387

uniapp+uniCloud实现微信小程序一键登录

(用户唯一标识),用户登录成功后,开发者服务器可以将openid和session_key保存,生成一个自定义登录态的token令牌响应给微信小程序,通过token可以查询openid和session_key,小程序下次请求只要携带着token就可以证明已经登录。这个API就是获取用户信息,每次请求都会弹出授权窗口(这个可能会不弹,这个要看你的版本,根据版本来定,不懂的可以留下评论),用户同意后会返回。到这里就可以实现微信一键登录了,快去试试吧,有问题可以在评论区留言,我看见会尽我知道的为你解答。

lb2917的博客 2576

[WC2016]挑战NPC,一般图最大匹配+奇妙性质

正题       题目链接       这题一眼看上去很懵逼,看到要使&lt;=1的最大,还以为是拆边网络流,结果发现不行。       正解一般图最大匹配。       我们把一个袋子拆成三个点的一个环。       然后对于,我们从vi向ui对应的环的三个点连边。       跑最大匹配,答案就是 证明       首先我们可以保证每一个球都有一个匹配。        因为我...

Deep_Kevin的娱乐空间 642

UE4项目迁移指南:如何无缝导入外部.uasset文件并保持材质关联

本文详细解析了将外部.uasset文件无缝导入UE4项目的专业方法。针对手动复制文件时常见的材质关联丢失问题,提供了使用引用查看器进行诊断和修复的实用技巧,并推荐使用引擎内置的“迁移”功能确保资源依赖关系的完整性,帮助开发者高效整合项目资源。

t8u9v0的博客 1046

PMP--工件

合同是指对双方都有约束力的协议,强制卖方提供规定的产品、服务或结果,以及强制买方支付相应的费用。它还可能包括处于中间状态的特性,例如已设计但尚未构建的特性、质量保证中的特性或测试中的特性。RACI 矩阵是一种常见的方法,用于显示执行、担责、咨询或知情,且与项目活动、决策和可交付物有关的干系人。计划是提议的实现某种目标的方式。在项目开始前或开始时创建的文件,涉及与项目有关的战略、商业或高层级的信息。或 © 它们是用特定方法创建的结果,例如,虽然成本估算结果是一个重要工件,它们是用不同估算方法得出的结果。

stqer的博客 1665

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

如果是一堆球一堆筐,每一个筐里只能放一个球,求最大能放多少个球, 那么就是一个二分图的最大匹配问题,非常简单,我们一个球一个点作为二分图的左部,一个筐一个点作为二分图的右部,直接跑最大流即可。但是这里我们一个筐不止放一个球,我们一个筐最多可以放三个球,也就是说如果我们一个筐作为一个点的话,我们无法判断筐内到底放了几个球,所以我们根据一个筐能放三个球把一个筐拆成三个点,然后我们把一个筐拆成的三个点互相链接。这样就不再是一个二分图了,就变成了一个可能有奇环的一般图,所以很明显就是一个带花树求一般图匹配问题。 .

繁凡さん的博客 550

《网络安全自学教程》- Nmap使用及扫描原理分析

使用Nmap进行端口扫描、主机发现、服务识别、操作系统识别、指定脚本、结果导出文件,使用wireshark抓包分析扫描原理。

wangyuxiang946的博客 1万+

uoj171 bzoj 4405: [wc2016]挑战NPC 一般图最大匹配

不得不说建图太巧妙了,我在知道是一般图最大匹配的情况下都不会建图。。。        首先每个筐放三个,这个“三”是很关键的。        把一个筐拆成三个点,然后每一个球向可以放的三个筐都连边;同时三个筐之间互相连边。那么如果一个筐只有        注意bzoj和uoj上面的输出是不一样的。 AC代码如下(uoj): #include #include #include #defi

lych的博客 1427

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

[WC2016]挑战NPC【一般图最大匹配 带花树】

题目链接 很容易想到的是每个球肯定是去和它能连接边的对应的篮子的三个状态进行连接边,但是怎样生成更多的半空框子呢?这里我们可以将每个框子拆开来的点的第2和第3个点连接,也就是我们也想让更多的半空的框子生成,所以的话,最后的半空框子的个数就是总的匹配数减去N个球都必须要匹配的个数。 #include <iostream> #include <cstdio> #include <cmath> #include <string> #include <.

既然弱小,就只顾变强就是了 208

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

BZOJ4405: [wc2016]挑战NPC 一般图最大匹配

有n个球,用整数1到n编号。还有m个筐子,用整数1到m编号。 每个筐子最多能装3个球。 每个球只能放进特定的筐子中。具体有e个条件,第i个条件用两个整数vi和ui描述,表示编号为vi的球可以放进编号为ui的筐子中。 每个球都必须放进一个筐子中。如果一个筐子内有不超过1个球,那么我们称这样的筐子为半空的。 求半空的筐子最多有多少个,以及在最优方案中,每个球分别放在哪个筐子中。 注:BZ上输出

リーインカーネイション 658

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

bzoj4405 [wc2016]挑战NPC(一般图最大匹配)

我们把每一个筐子拆成三个,互相连边,得到一个三元环。x向y拆成的三个点连边。我们不难发现,每一个匹配都对应了一种分配方法。如果一个筐子至多放了1个球,则它的三元环中自己还有且仅有一对匹配。所以半空的筐子数=最大匹配-n 然后是个一般图,要用带花树来求最大匹配,模板见uoj79

Icefox的博客 394

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

#171. 【WC2016】挑战NPC 小 N 最近在研究 NP 完全问题,小 O 看小 N 研究得热火朝天,便给他出了一道这样的题目: 有 nnn 个球,用整数 111 到 nnn 编号。还有 mmm 个筐子,用整数 111 到 mmm 编号。 每个筐子最多能装 3 个球。 每个球只能放进特定的筐子中。具体有 eee 个条件,第 iii 个条件用两个整数 viviv...

Ephemeral 524

[UOJ171][WC2016]挑战NPC-一般图最大匹配

挑战NPC描述小 N 最近在研究 NP 完全问题,小 O 看小 N 研究得热火朝天,便给他出了一道这样的题目:有 nn 个球,用整数 11 到 nn 编号。还有 mm 个筐子,用整数 11 到 mm 编号。每个筐子最多能装 3 个球。每个球只能放进特定的筐子中。具体有 ee 个条件,第 ii 个条件用两个整数 vivi 和 uiui 描述,表示编号为 vivi 的球可以放进编号为 uiui 的筐子中

「嫌われ者のフィロソフィ」 333

【BZOJ4405】挑战NPC 带花树模板 一般图最大匹配

这段时间被主教练找的各种poj英文题虐的头昏脑涨也没时间来更新博客QAQ 好不容易找了时间来学带花树QAQ #include #include #include #include #include #include #include #include using namespace std; #define MAXN 2005 #define MAXM 200005 int N,M,Q,hea

鲜衣怒马少年郎 341

[一般图最大匹配 带花树] BZOJ 4405 [wc2016]挑战NPC

%%VFK 神出题 神构图 传送门 http://blog.youkuaiyun.com/yihuikang/article/details/10460997 http://fanhq666.blog.163.com/blog/static/8194342620120304463580/ 模板基本是按照上面来打的 #include #include #in

雯舞 1398

[UOJ171][WC2016] 挑战NPC 一般图最大匹配

诶解法真巧 将一个篮子拆成三个点,且互相联通 对于所有的球x能放到篮子y,把球x向三个篮子拆的点连边若一个篮子里放进来的球数小于等于1,那么篮内部也会有一条匹配边#include <iostream> #include <cstdio> #include <cstring> #include <vector>#define N 2500using namespace std;int fa[N],

HbFS- 340

BZOJ 4405 [wc2016]挑战NPC 带花树 一般图最大匹配

https://www.lydsy.com/JudgeOnline/problem.php?id=4405 这道题大概就是考场上想不出来,想出来也调不出来的题。 把每个桶拆成三个互相有边的点,每个球向它连接的桶的三个点分别连边。 0球1桶,匹配数为1;1球1桶,匹配数为2;2球一桶,匹配数为2;3球一桶,匹配数为3; 发现每种半桶的情况下匹配数都比该桶中放的球数大1,那么ans=最大匹配数...

weixin_30835923的博客 132

P4258 [WC2016]挑战NPC(一般图匹配)

P4258 [WC2016]挑战NPC(一般图匹配) 很妙,一个筐最多装3个球,显然是拆点,但是贡献只有半筐(球数小于2)。 考虑建图的时候,把三个筐点相互连边。 这样筐0个球,内部产生一个匹配,贡献为1。实际贡献为1 1个球,内部产生一个匹配,贡献为2。实际贡献为1 2个球,内部产生0个匹配,贡献为2。实际贡献为0 3个球,内部产生0个匹配,贡献为3.实际贡献为0. 观察发现,贡献 - 匹配的球数 = 实际贡献。 这样跑一遍一般图匹配,然后减去总球数nnn即可。 输出注意还原点的编号。 // Probl

Harris-H的博客 992

UOJ171. 挑战NPC【WC2016】【带花树】【一般图匹配】

UOJ#171. 挑战NPC【WC2016】 一般图最大匹配 题目飞机票 带花树(一般最大匹配)讲解 没想到建图居然建一般图,考场上想了很久的二分图最大匹配,大样例都过不了 (๑•́ ₃•̀๑) 现有nn个小球,mm个框子,ee个条件,条件(u,v)(u,v)表示uu个小球能放进第vv个框子里,当框子里的小球数量 ≤\le 1个时,我们称这个框子为半满,求在所有小球都在框子

snowMyDream's BLOG 1415

WC2016 挑战NPC 一般图匹配

题目: 有 n 个球,用整数 1 到 n  编号。还有 m 个筐子,用整数 1 到 m  编号。 每个筐子最多能装 3 个球。 每个球只能放进特定的筐子中。具体有 e  个条件,第 i  个条件用两个整数 vi 和 ui 描述,表示编号为 vi 的球可以放进编号为 ui 的筐子中。 每个球都必须放

Free Chalks~~~ 跳动的粉笔 957
上一篇: UOJ275组合数问题
下一篇: 博弈图BFS
Timsei
博客等级 码龄10年 344粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值