【题解】 [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 }