牛客练习赛30: E. 国政议事(二分匹配)
链接:https://ac.nowcoder.com/acm/contest/216/E
来源:牛客网
题目描述
对于任何一个高速发展的发展中国家而言,一个高效的领导小组是不可或缺的。
现在我们知道k国的领导小组有n个人,准备举行一次会议,他们一共需要处理m个重要事项,第i个重要事项在ai手中,并且该重要事项需要交给bi来具体实施。
人都到齐后,他们会进行一个“交换意见”的环节,即每个人都会把自己手中一个自己认为关键的事项i的相关材料转发给该事项的具体实施者bi(如果该人手中没有重要事项,则不进行操作),随后,每个人都从自己收到的重要事项中选择一个自己认为关键的去实施,每实施一个事项,可以获得1点效率。
很显然,领导小组希望在这次会议中的效率更高,请你帮助他们决定在效率最高的情况下,哪些事项是必须执行的。
输入描述:
第一行两个正整数n(n<=500),m(m<=20000);接下来m行,第i+1行两个正整数ai和bi表示重要事项i在ai手中,并且需要交给bi具体实施,可能存在ai=bi的情况
输出描述:
第一行一个正整数ans,num表示该会议的最高效率和必须执行的事项个数;接下来num行,每行有一个正整数,表示在最高效率的情况下,必须执行的事项的标号,按照字典序从小到大输出。
输入
3 3 1 2 1 3 2 3
输出
2 2 1 3
一个人只能转手一次材料 → 二分图左边的每个点只能选一次
一个人只能实施一次计划 → 二分图右边的每个点只能选一次
一份计划经过转手+实施效率+1 → 选中一条边+1效率
所以这道题就是个二分匹配
将每个人拆成两个点,一个点表示转手(左),一个点表示实施(右), 对于第i个计划ai, bi,左边第ai个点向右边第bi个点连边
求出最大匹配就是第一问的答案,很简单
而第二问相当于是有多少条边你删掉它之后,最大匹配会-1,输出这些边
考虑直接暴力删除每一条边,每次求一遍最大匹配,复杂度O(nm²), 会超时
仔细分析一下可以发现不需要暴力每条边,只要先求一次二分匹配,然后暴力最大匹配的那些边即可,复杂度O(n²m)
除此之外二分匹配可以通过预处理增广路优化成O(nmsqrt(n)),加上其实跑不满,完全可过
#pragma comment(linker, "/STACK:102400000,102400000")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<string>
#include<math.h>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
#define LL long long
#define mod 1000000007
vector<int> G[505], F[505], B;
int ban, n, m, dis, lx[505], ly[505], dx[505], dy[505], vis[505], q[20005];
int HKSech();
int Sech(int u);
int main(void)
{int u, v, i, Ans, p, ans, cnt;scanf("%d%d", &n, &m);for(i=1;i<=m;i++){scanf("%d%d", &u, &v);G[u].push_back(v);F[u].push_back(i);}m = n;cnt = Ans = ban = 0;memset(lx, -1, sizeof(lx));memset(ly, -1, sizeof(ly));while(HKSech()){memset(vis, 0, sizeof(vis));for(i=1;i<=n;i++){if(lx[i]==-1 && Sech(i))Ans++;}}for(i=1;i<=n;i++){if(lx[i]!=-1)B.push_back(lx[i]);}for(p=0;p<B.size();p++){ans = 0, ban = B[p];memset(lx, -1, sizeof(lx));memset(ly, -1, sizeof(ly));while(HKSech()){memset(vis, 0, sizeof(vis));for(i=1;i<=n;i++){if(lx[i]==-1 && Sech(i))ans++;}}if(ans!=Ans)q[++cnt] = ban;}printf("%d %d\n", Ans, cnt);sort(q+1, q+cnt+1);for(i=1;i<=cnt;i++)printf("%d\n", q[i]);return 0;
}int HKSech()
{int i, x, v;dis = 100000000;queue<int> q;memset(dx, -1, sizeof(dx));memset(dy, -1, sizeof(dy));for(i=1;i<=n;i++){if(lx[i]==-1){q.push(i);dx[i] = 0;}}while(q.empty()==0){x = q.front();q.pop();if(dx[x]>dis)break;for(i=0;i<G[x].size();i++){v = G[x][i];if(F[x][i]==ban)continue;if(dy[v]==-1){dy[v] = dx[x]+1;if(ly[v]==-1)dis = dy[v];else{dx[ly[v]] = dy[v]+1;q.push(ly[v]);}}}}if(dis==100000000)return 0;return 1;
}
int Sech(int x)
{int i, v;for(i=0;i<G[x].size();i++){v = G[x][i];if(F[x][i]==ban)continue;if(vis[v]==0 && dy[v]==dx[x]+1){vis[v] = 1;if(ly[v]!=-1 && dy[v]==dis)continue;if(ly[v]==-1 || Sech(ly[v])){ly[v] = x;lx[x] = F[x][i];return 1;}}}return 0;
}
牛客练习赛30: E. 国政议事(二分匹配)相关推荐
- 牛客练习赛30: D. 消消乐(二分匹配+输出最小点覆盖)
链接:https://ac.nowcoder.com/acm/contest/216/D 来源:牛客网 题目描述 r神在和小b比赛玩一个名为"消消乐"的游戏,在一个n*m的棋盘上, ...
- 2021牛客练习赛90
2021牛客练习赛90 B.寒冬信使 C.盾与战锤 B.寒冬信使 题目链接:https://ac.nowcoder.com/acm/contest/11180/B code: #include< ...
- 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...
- 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 牛客练习赛34 E little w and Digital Root(数位dp)
title: 牛客练习赛34 E little w and Digital Root(数位dp) date: 2018-12-17 22:38:37 tags: 数位dp categories:ACM ...
- 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)
title: 牛客练习赛34 - C little w and Segment Coverage(思维.树状数组) date: 2018-12-15 16:36:55 tags: [树状数组,思维] ...
- 牛客练习赛52 | C | [烹饪] (DP,裴蜀定理,gcd)
牛客练习赛52 C 烹饪 链接:https://ac.nowcoder.com/acm/contest/1084/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...
- 牛客练习赛73 D 离别(线段树+右端点排序离线查询)
牛客练习赛73 D 离别 思路: 对于每一个固定的右端点i,我们都找到一个区间(l,r)使得区间中的点为左端点时 里面最大的的种数为k. 这个可以用队列或者vector来维护. 然后我们对于q个查询, ...
- 牛客练习赛75 D 减数游戏(队列优化(需要取模的)堆)
牛客练习赛75 D 减数游戏 思路:写一下式子可以发每次选择最小的两个数进行操作,最后得到的答案会是最大的,那我们可以将它放进一个最小堆中来维护,但是里面的数是需要取模的,当它取模的时候,将会变小.那 ...
最新文章
- Ubuntu16.04中WPS不能输入中文
- 纯中文C++代码,可运行
- Kinect for windows的脸部识别
- PHP的chunk_split() 函数把字符串分割为一连串更小的部分
- TCP的拥塞控制--慢启动,拥塞避免,快重传,快速恢复
- Android FTP Server 1
- 操作表格_Excel表格基础操作-新手入门级
- python中空字符串的布尔值是什么_Python的布尔值与空值
- JAVA面试题(126~170)《下》
- 如何用PPT来实现三维3D效果,附参数设置详解
- Orleans 3.0 发布,微软下一代云计算编程模式
- 《C语言及程序设计》实践参考——太乐了
- 深度学习下,中文分词是否还有必要?——ACL 2019论文阅读笔记
- html5 图形水平运动,【分享】HTML5的Canvas制作3D动画效果分享
- android 激光打印机,#本站首晒# 安卓端无线打印的方案选择 兄弟 DCP1618W 一体机...
- analyze 命令
- 如何快速画好一张程序流程图
- 计算机通讯技术的专业有哪些,通信类包括哪些专业
- apex 安装/使用 记录
- 泣神曲服务器维护,泣神曲手游预约-泣神曲官网安卓版预约v1.0.0_第一手游网
热门文章
- python培训价目表-python培训费用多少?
- 免费python自学攻略-420小时学习代码之后:如何教你免费自学Python
- python零基础学习书-Python零基础到进阶必读的书藉:Python学习手册pdf免费下载
- 如何系统的自学python-如何系统的学习python?
- 11个程序员最常犯的MySQL错误(PHP开发)
- element-ui 分页索引问题
- python turtle画熊猫人_Python 使用turtle插件,画小猪佩奇
- 数据库原理mysql_数据库原理:MySql的安装
- ActionScript 3.0 API 中的 Video 类
- python中唯一的映射类型是什么_Python基础类型之字典(dict)