链接: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. 国政议事(二分匹配)相关推荐

  1. 牛客练习赛30: D. 消消乐(二分匹配+输出最小点覆盖)

    链接:https://ac.nowcoder.com/acm/contest/216/D 来源:牛客网 题目描述 r神在和小b比赛玩一个名为"消消乐"的游戏,在一个n*m的棋盘上, ...

  2. 2021牛客练习赛90

    2021牛客练习赛90 B.寒冬信使 C.盾与战锤 B.寒冬信使 题目链接:https://ac.nowcoder.com/acm/contest/11180/B code: #include< ...

  3. 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...

  4. 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  5. 牛客练习赛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 ...

  6. 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)

    title: 牛客练习赛34 - C little w and Segment Coverage(思维.树状数组) date: 2018-12-15 16:36:55 tags: [树状数组,思维] ...

  7. 牛客练习赛52 | C | [烹饪] (DP,裴蜀定理,gcd)

    牛客练习赛52 C 烹饪 链接:https://ac.nowcoder.com/acm/contest/1084/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...

  8. 牛客练习赛73 D 离别(线段树+右端点排序离线查询)

    牛客练习赛73 D 离别 思路: 对于每一个固定的右端点i,我们都找到一个区间(l,r)使得区间中的点为左端点时 里面最大的的种数为k. 这个可以用队列或者vector来维护. 然后我们对于q个查询, ...

  9. 牛客练习赛75 D 减数游戏(队列优化(需要取模的)堆)

    牛客练习赛75 D 减数游戏 思路:写一下式子可以发每次选择最小的两个数进行操作,最后得到的答案会是最大的,那我们可以将它放进一个最小堆中来维护,但是里面的数是需要取模的,当它取模的时候,将会变小.那 ...

最新文章

  1. Ubuntu16.04中WPS不能输入中文
  2. 纯中文C++代码,可运行
  3. Kinect for windows的脸部识别
  4. PHP的chunk_split() 函数把字符串分割为一连串更小的部分
  5. TCP的拥塞控制--慢启动,拥塞避免,快重传,快速恢复
  6. Android FTP Server 1
  7. 操作表格_Excel表格基础操作-新手入门级
  8. python中空字符串的布尔值是什么_Python的布尔值与空值
  9. JAVA面试题(126~170)《下》
  10. 如何用PPT来实现三维3D效果,附参数设置详解
  11. Orleans 3.0 发布,微软下一代云计算编程模式
  12. 《C语言及程序设计》实践参考——太乐了
  13. 深度学习下,中文分词是否还有必要?——ACL 2019论文阅读笔记
  14. html5 图形水平运动,【分享】HTML5的Canvas制作3D动画效果分享
  15. android 激光打印机,#本站首晒# 安卓端无线打印的方案选择 兄弟 DCP1618W 一体机...
  16. analyze 命令
  17. 如何快速画好一张程序流程图
  18. 计算机通讯技术的专业有哪些,通信类包括哪些专业
  19. apex 安装/使用 记录
  20. 泣神曲服务器维护,泣神曲手游预约-泣神曲官网安卓版预约v1.0.0_第一手游网

热门文章

  1. python培训价目表-python培训费用多少?
  2. 免费python自学攻略-420小时学习代码之后:如何教你免费自学Python
  3. python零基础学习书-Python零基础到进阶必读的书藉:Python学习手册pdf免费下载
  4. 如何系统的自学python-如何系统的学习python?
  5. 11个程序员最常犯的MySQL错误(PHP开发)
  6. element-ui 分页索引问题
  7. python turtle画熊猫人_Python 使用turtle插件,画小猪佩奇
  8. 数据库原理mysql_数据库原理:MySql的安装
  9. ActionScript 3.0 API 中的 Video 类
  10. python中唯一的映射类型是什么_Python基础类型之字典(dict)