BZOJ 1191 [HNOI2006]超级英雄Hero:二分图匹配 匈牙利算法

Posted Leohh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 1191 [HNOI2006]超级英雄Hero:二分图匹配 匈牙利算法相关的知识,希望对你有一定的参考价值。

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1191

题意:

  有m道题,每答对一题才能接着回答下一个问题。

  你一道题都不会,但是你有n个“锦囊妙计”(每个只能用一次)。

  对于每道题,你只能用该题规定的两种锦囊中的一种,来解决这道题。

  问你最多能解决多少道题。

 

题解:

  二分图最大匹配。

  匈牙利算法。

  

  问题与锦囊匹配。

  最大匹配即为最多回答数。

 

  但是题目中要求题目必须连续回答,不能中断。

  所以在给每一个问题配对时,一旦匹配不上,就终止匹配。

 

AC Code:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #define MAX_N 1005
 5 
 6 using namespace std;
 7 
 8 int n,m;
 9 int ans=0;
10 int match[MAX_N];
11 bool vis[MAX_N];
12 bool edge[MAX_N][MAX_N];
13 
14 bool hungary(int now)
15 {
16     for(int i=0;i<n;i++)
17     {
18         if(edge[now][i] && !vis[i])
19         {
20             vis[i]=true;
21             if(match[i]==-1 || hungary(match[i]))
22             {
23                 match[i]=now;
24                 return true;
25             }
26         }
27     }
28     return false;
29 }
30 
31 void read()
32 {
33     memset(edge,false,sizeof(edge));
34     cin>>n>>m;
35     int a,b;
36     for(int i=0;i<m;i++)
37     {
38         cin>>a>>b;
39         edge[i][a]=true;
40         edge[i][b]=true;
41     }
42 }
43 
44 void solve()
45 {
46     memset(match,-1,sizeof(match));
47     for(int i=0;i<m;i++)
48     {
49         memset(vis,false,sizeof(vis));
50         if(hungary(i)) ans++;
51         else break;
52     }
53 }
54 
55 void print()
56 {
57     cout<<ans<<endl;
58 }
59 
60 int main()
61 {
62     read();
63     solve();
64     print();
65 }

 

以上是关于BZOJ 1191 [HNOI2006]超级英雄Hero:二分图匹配 匈牙利算法的主要内容,如果未能解决你的问题,请参考以下文章

bzoj 1191: [HNOI2006]超级英雄Hero

bzoj 1191: [HNOI2006]超级英雄Hero

BZOJ1191: [HNOI2006]超级英雄Hero

BZOJ 1191 [HNOI2006]超级英雄Hero

BZOJ 1191 HNOI2006 超级英雄Hero

BZOJ 1191: [HNOI2006]超级英雄Hero