【题解】 [SCOI2010]连续攻击游戏 (二分图匹配)

原题目戳我

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

 

posted @ 2018-03-15 19:40  Ning_Mew  阅读(146)  评论(0编辑  收藏  举报