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:二分图匹配 匈牙利算法的主要内容,如果未能解决你的问题,请参考以下文章