题解 [ZJOI2007]矩阵游戏 (二分图匹配)

Posted Ning_Mew

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解 [ZJOI2007]矩阵游戏 (二分图匹配)相关的知识,希望对你有一定的参考价值。

原题目戳我

Solution:

方法很巧妙,我们把每个装备的属性 与 装备编号连起来

从1-10000跑二分图,如果出现断层,就退出,输出答案就好。

memset清理bool快一点,int洛谷上超时了

板子题

 

Code:

技术分享图片
 1 //It is coded by Ning_Mew on 3.14
 2 #include<bits/stdc++.h>
 3 
 4 using namespace std;
 5 
 6 const int maxn=1e6+7;
 7 
 8 int n,ans=0,be[maxn];
 9 bool vis[maxn];
10 int head[maxn],cnt=0;
11 struct Edge{
12     int nxt,to;
13 }edge[maxn*2];
14 
15 void add(int from,int to){
16     edge[++cnt].nxt=head[from];
17     edge[cnt].to=to;
18     head[from]=cnt;
19 }
20 bool find(int k){
21     for(int i=head[k];i!=0;i=edge[i].nxt){
22         int v=edge[i].to;
23         if(vis[v]==false){
24             vis[v]=true;
25             if(be[v]==-1||find(be[v])){be[v]=k;return true;}
26         }
27     }
28     return false;
29 }
30 
31 int main(){
32     scanf("%d",&n);
33     for(int i=1;i<=n;i++){
34         int a,b;scanf("%d%d",&a,&b);
35         add(a,i);add(b,i);
36     }
37     memset(be,-1,sizeof(be));
38     memset(vis,-1,sizeof(vis));
39     for(int i=1;i<=10000;i++){
40         memset(vis,false,sizeof(vis));
41         if(find(i))ans++;
42         else break;
43     }
44     printf("%d\n",ans);
45     return 0;
46 } 
View Code

 

以上是关于题解 [ZJOI2007]矩阵游戏 (二分图匹配)的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 1059 [ZJOI2007]矩阵游戏:二分图匹配

[ZJOI2007]矩阵游戏

bzoj 1059: [ZJOI2007]矩阵游戏 二分图匹配

BZOJ 1059 [ZJOI2007]矩阵游戏 (二分图最大匹配)

bzoj 1059: [ZJOI2007]矩阵游戏 [二分图][二分图最大匹配]

bzoj1059[ZJOI2007]矩阵游戏 二分图匹配