BZOJ 1191 超级英雄 Hero 题解

Description

现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金。主持人问题准备了若干道题目,只有当选手正确回答一道题后,才能进入下一题,否则就被淘汰。为了增加节目的趣味性并适当降低难度,主持人总提供给选手几个“锦囊妙计”,比如求助现场观众,或者去掉若干个错误答案(选择题)等等。 这里,我们把规则稍微改变一下。假设主持人总共有m道题,选手有n种不同的“锦囊妙计”。主持人规定,每道题都可以从两种“锦囊妙计”中选择一种,而每种“锦囊妙计”只能用一次。我们又假设一道题使用了它允许的锦囊妙计后,就一定能正确回答,顺利进入下一题。现在我来到了节目现场,可是我实在是太笨了,以至于一道题也不会做,每道题只好借助使用“锦囊妙计”来通过。如果我事先就知道了每道题能够使用哪两种“锦囊妙计”,那么你能告诉我怎样选择才能通过最多的题数吗?

Input

输入文件的一行是两个正整数n和m(0 < n <1001,0 < m < 1001)表示总共有n中“锦囊妙计”,编号为0~n-1,总共有m个问题。
以下的m行,每行两个数,分别表示第m个问题可以使用的“锦囊妙计”的编号。
注意,每种编号的“锦囊妙计”只能使用一次,同一个问题的两个“锦囊妙计”可能一样。

Output

第一行为最多能通过的题数p

Sample Input

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

Sample Output

4
 
—————————————————分割线———————————————————
这道是一道二分图匹配裸题,匈牙利算法模板题。
建议使用邻接表储存边,时间复杂度较低。
 
代码如下:
 
 /**************************************************************
Problem: 1191
User: shadowland
Language: C++
Result: Accepted
Time:40 ms
Memory:1692 kb
****************************************************************/ #include "bits/stdc++.h" using namespace std ;
const int maxN = ;
struct Match {int to , next ;}; Match E[ maxN<< ] ;
int head [ maxN ] , match[ maxN ] ;
bool vis [ maxN ] ; int cnt = ,ans = ; void Add_Edge ( int x , int y ) {
E[ ++cnt ] . to = y ;
E[ cnt ] . next = head[ x ] ;
head [ x ] = cnt ;
} bool Hungary ( int x ) {
for ( int i = head[ x ] ; i ; i = E[ i ] . next ) {
if ( vis[ i ] ) continue ;
int temp = E[ i ] . to ;
vis[ i ] = true ;
if ( !match[ temp ] || Hungary ( match[ temp ] ) ) {
match [ temp ] = x ;
return true ;
}
}
return false ;
} int main ( ) {
int N , M ;
memset ( match , , sizeof ( match ) ) ;
scanf ( "%d %d" , &N , &M ) ;
for ( int i= ; i<=M ; ++i ) {
int x1 , x2 ;
scanf ( "%d%d" , &x1 , &x2 ) ;
Add_Edge ( i , x1 ) , Add_Edge ( i , x2 ) ;//使用邻接表储存
}
int k ;
for ( k= ; k<=M ; ++k ) {
memset ( vis , false , sizeof ( vis ) ) ;
if ( !Hungary ( k ) )
break ;
}
printf ( "%d\n" , k - ) ;
return ;
}
2016-09-16 16:00:59
 
 
(完)
 
 

最新文章

  1. 使用InstallAnywhere工具打包Java_Web程序
  2. android-Activity(四大组件之一)
  3. [HDU 4089]Activation[概率DP]
  4. python 自动化之路 day 01.1 数据类型
  5. 安卓开发之RecyclerView
  6. 51cto那些技术专题们
  7. 事件日志:无法加载站点/服务的所有 ISAPI 筛选器。因此启动中止。
  8. The summary of Interview
  9. PHP程序员从小白到高手,掌握这些技能少走弯路
  10. 包建强的培训课程(6):Android App瘦身优化
  11. Hadoop记录-变更
  12. Linux inode空间占满 “no space left on device”
  13. 阿里八八Alpha阶段Scrum(8/12)
  14. DOM操作——JavaScript怎样添加、移除、移动、复制、创建和查找节点
  15. MySQL数据库执行sql语句创建数据库和表提示The &#39;InnoDB&#39; feature is disabled; you need MySQL built with &#39;InnoDB&#39; to have it working
  16. NOIP初赛 BLESS ALL!
  17. Oracletop10物理段
  18. java 数据结构与算法---二叉树
  19. 理解C# 4 dynamic(4) – 让人惊艳的Clay(转)
  20. 洛谷P1558 色板游戏 [线段树]

热门文章

  1. node 初识
  2. foreach与Iterable学习
  3. golang基础知识之encoding/json package
  4. Ubuntu下配置samba实现文件夹共享
  5. 第十篇:扩展SOUI的控件及绘图对象(ISkinObj)
  6. Codeforces Round #212 (Div. 2) D. Fools and Foolproof Roads 并查集+优先队列
  7. C语言中运算符的口决
  8. 简单解释Windows如何使用FS段寄存器
  9. jfreeChart柱状图各属性详细设置
  10. UVA 12232 Exclusive-OR(并查集+思想)