额,显然是二分图匹配
匈牙利算法shi过去
一开始打了个匈牙利T了
然后网上有题解说戳个时间标记就可以了,不用每一遍都memset
恩,很有道理,类似于空间换时间吧
下面的代码是T的,我劝你还是自己好好打一遍
#include<iostream>
#include<stdio.h>
using namespace std;
int head[2000003],to[2000003],nex[2000003],lin_toto[2000003],used[2000003];
int tot,n,nowtime;
void add(int u,int v){
to[++tot]=v;
nex[tot]=head[u];
head[u]=tot;
}
bool find(int x){
for(int i=head[x];i;i=nex[i]){
int v=to[i];
if(used[v]!=nowtime){
used[v]=nowtime;
if(!lin_toto[v]||find(lin_toto[v])){
lin_toto[v]=x;
return 1;
}
}
}
return 0;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int a,b;
scanf("%d%d",&a,&b);
add(a,i);
add(b,i);
}
int ans;
for(int i=1;i<=n;i++){
nowtime++;
if(find(i)==false){
ans=i-1;
break;
}
}
printf("%d\n",ans);
return 0;
}
/*
in:
3
1 2
3 2
4 5
out:
2
*/