[luogu2319 HNOI2006] 超级英雄 (匈牙利算法)

传送门

Description

现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金。主持人问题准备了若干道题目,只有当选手正确回答一道题后,才能进入下一题,否则就被淘汰。为了增加节目的趣味性并适当降低难度,主持人总提供给选手几个“锦囊妙计”,比如求助现场观众,或者去掉若干个错误答案(选择题)等等。

这里,我们把规则稍微改变一下。假设主持人总共有m道题,选手有n种不同的“锦囊妙计”。主持人规定,每道题都可以从两种“锦囊妙计”中选择一种,而每种“锦囊妙计”只能用一次。我们又假设一道题使用了它允许的锦囊妙计后,就一定能正确回答,顺利进入下一题。现在我来到了节目现场,可是我实在是太笨了,以至于一道题也不会做,每道题只好借助使用“锦囊妙计”来通过。如果我事先就知道了每道题能够使用哪两种“锦囊妙计”,那么你能告诉我怎样选择才能通过最多的题数吗?

Input

输入的第一行是两个正整数 n 和 m ( 0 < n < 1001, 0 < m < 1001 )表示总共有 n 种“锦囊妙计”,编号为 0∼n−1 ,总共有 m 个问题。

以下的m行,每行两个数,分别表示第 m 个问题可以使用的“锦囊妙计”的编号。

注意,每种编号的“锦囊妙计”只能使用一次,同一个问题的两个“锦囊妙计”可能一样。

Output

输出的第一行为最多能通过的题数 p ,接下来 p 行,每行为一个整数,第 i 行表示第 i 题使用的“锦囊妙计的编号”。

如果有多种答案,那么任意输出一种,本题使用 Special Judge 评判答案。

Sample Input

5 6
3 2
2 0
0 3
0 4
3 2
3 2

Sample Output

4
3
2
0
4

Solution

裸匈牙利算法

Code

//By Menteur_Hxy
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
using namespace std;int read() {int x=0,f=1; char c=getchar();while(!isdigit(c)) {if(c=='-')f=-f; c=getchar();}while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();return x*f;
}const int N=1010;
int n,m,ans;
int vis[N],l[N],r[N];
vector<int> V[N];bool dfs(int u) {int siz=V[u].size(),v;F(i,0,siz-1) if(!vis[v=V[u][i]]) {vis[v]=1;if(!l[v]||dfs(l[v])) {l[v]=u;r[u]=v;return 1;}}return 0;
}int main() {n=read(),m=read();F(i,1,m) {int x=read(),y=read();V[i].push_back(x),V[i].push_back(y);}F(i,1,m) {memset(vis,0,sizeof(vis));if(!dfs(i)) break;ans++;}printf("%d\n",ans);F(i,1,ans) printf("%d\n",r[i]);return 0;
}

posted @ 2018-08-02 15:21 Menteur_Hxy 阅读(...) 评论(...) 编辑 收藏

[luogu2319 HNOI2006] 超级英雄 (匈牙利算法)相关推荐

  1. B1192 [HNOI2006]超级英雄Hero 二分图匹配

    先检讨一下,前一段时间开学,做题懒得发博客,也不总结...现在捡起来. 这个题一看是裸的二分图匹配,但是仔细一看还有一些区别,就是必须要连续的连接,否则直接退出.因为前一道题答不出来的话后面的题就没有 ...

  2. 二分图匹配匈牙利算法DFS实现

    1 /*==================================================*\ 2 | 二分图匹配(匈牙利算法DFS 实现) 3 | INIT: g[][]邻接矩阵; ...

  3. 解题报告:luogu P2423 [HEOI2012]朋友圈【最大团转最大点独立集(匈牙利算法+时间戳优化)】

    图的最大团:"任意两点之间都有一条边相连"的子图被称为无向图的团,点数最多的团为图的最大团 朋友圈中任意两个点之间都有关系,既是图中的团. 答案就是图中的最大团. 我们如果把B国的 ...

  4. 二分图最大匹配(匈牙利算法) POJ 3020 Antenna Placement

    题目传送门 1 /* 2 题意:*的点占据后能顺带占据四个方向的一个*,问最少要占据多少个 3 匈牙利算法:按坐标奇偶性把*分为两个集合,那么除了匹配的其中一方是顺带占据外,其他都要占据 4 */ 5 ...

  5. 二分图匹配的匈牙利算法

    匈牙利算法,很绕,其实写起来也就一点点长度.. bool find(int a){int i,j;for(i=head[a];i;i=next[i]){j=to[i];//获得相邻的点if(!unab ...

  6. 二分图-匈牙利算法模板

    二分图就不赘述了,我在知识资料整理有相关资料. .最大匹配  .最小路径覆盖  .最小点覆盖  .最大独立集 最大匹配:二分图中边集最大的那个匹配 最小路径(边)覆盖:用尽量小的不想交简单路径覆盖有向 ...

  7. 二分图的最大匹配—匈牙利算法

    [基本概念]: 二分图: 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分 ...

  8. BZOJ 1433 Luogu P2055 [ZJOI2009]假期的宿舍 匈牙利算法

    刚学了匈牙利正好练练手(我不会说一开始我写错了)(怕不是寒假就讲了可是我不会) 把人看做左部点,床看作右部点 建图:(!!在校相当于有床,不在校相当于没有床 但是要来学校) 1.在校的 不走的人 自己 ...

  9. 匈牙利算法学习笔记_Python代码

    学习华为上机测试题,遇见了下面题,很有意思,核心是匈牙利算法问题. 特此学习记录.资料均参考自网络. 匈牙利算法目的:找出两边最大的匹配的数量. 参考资料: https://blog.csdn.net ...

最新文章

  1. Java快速创建大量对象_3分钟 快速理解JVM创建对象的步骤!
  2. Solidity语言
  3. 用Swift实现一款天气预报APP(三)
  4. Matlab学习笔记——文件的打开与关闭
  5. Java读写文件的几种方式
  6. Python脚本--Apache配置文件
  7. 汽车电子专业知识篇(二)-汽车以太网如何影响ECU和传感器设计
  8. 网站域名解析端口_环境测试必备,无需注册域名,免费动态IP解析一键解析本地网站...
  9. Aop_AspectJ实现
  10. Linux mysql 主从复制
  11. 简便方法搭建Harbor镜像仓库
  12. tesseract--目前最好的OCR,支持中文
  13. redux-saga中间件的安装和使用-(三)
  14. html 表格设置图片背景透明,table标签怎么实现内容不透明,背景图片透明
  15. 计算机桌面锁定了没设密码怎么解锁,屏幕锁定怎么解锁?
  16. Mac OSX 下破解软件的一般方法及过程、 mark一下
  17. 解决 给Example类序列化依旧报:Serialized class com.chaz.pojo.SpaItemExample must implement java.io...需要序列化的错误
  18. Java流(Stream)操作实例-筛选、映射、查找匹配
  19. java中的switch case语句
  20. 基于Matlab模拟哈特曼波前探测器

热门文章

  1. JavaSE学生管理系统(ArrayList集合来做)
  2. winsvr服务器C盘突然满了的处理方法
  3. 软件采购必备:软件供应商评估表 之三-1(共七)
  4. 微信公众号简单开发(11)综合案例
  5. 上云精品,实力认证丨思迈特软件入驻华为云严选商城
  6. iOS 16.1 正式版发布,苹果 App Store 上架首批支持“实时活动”应用
  7. 未来5年,普通人如何才能抓住趋势逆袭? (转载的……)
  8. STM32L5单片机即将量产,Cortex-M33内核,更低功耗,更多安全!
  9. 微信小程序内嵌h5页面或者跳转至外部链接,及在webview页面添加元素
  10. java实现标准化考试系统详解(四)-----初始化操作实现