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

时间:2023-03-10 08:12:22
【题解】 [SCOI2010]连续攻击游戏 (二分图匹配)

原题目戳我

Solution:

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

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

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

板子题

Code:

 //It is coded by Ning_Mew on 3.14
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+; int n,ans=,be[maxn];
bool vis[maxn];
int head[maxn],cnt=;
struct Edge{
int nxt,to;
}edge[maxn*]; void add(int from,int to){
edge[++cnt].nxt=head[from];
edge[cnt].to=to;
head[from]=cnt;
}
bool find(int k){
for(int i=head[k];i!=;i=edge[i].nxt){
int v=edge[i].to;
if(vis[v]==false){
vis[v]=true;
if(be[v]==-||find(be[v])){be[v]=k;return true;}
}
}
return false;
} int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
int a,b;scanf("%d%d",&a,&b);
add(a,i);add(b,i);
}
memset(be,-,sizeof(be));
memset(vis,-,sizeof(vis));
for(int i=;i<=;i++){
memset(vis,false,sizeof(vis));
if(find(i))ans++;
else break;
}
printf("%d\n",ans);
return ;
}