#include<bits/stdc++.h>
using namespace std;
const int maxn=4004;
int n,tot;
struct hi{
int y,next;
}b[maxn*16];
int last[maxn],d[maxn][2];
bool f[maxn];
void add(int s,int t){
b[++tot].y=t;
b[tot].next=last[s];
last[s]=tot;
}
int dfs(int x){
for(int i=last[x];i;i=b[i].next){
int y=b[i].y;
if(f[y]==false){
f[y]=true;
if(!d[y][0]||dfs(d[y][0])){
d[y][0]=x;
return 1;
}
if(!d[y][1]||dfs(d[y][1])){
d[y][1]=x;
return 1;
}
}
}
return 0;
}
int main(){
cin>>n;
int s,t;
for(int i=1;i<=n*2;i++){
scanf("%d %d",&s,&t);
add(i,s);
add(i,t);
}
int ans=0;
for(int i=1;i<=n*2;i++){
ans+=dfs(i);
memset(f,false,sizeof(f));
}
printf("%d",ans);
return 0;
}
为什么第20行封路 f[y]=true 不能移到底下两个判断里边封?我试了如果在判断里面封就输出寂寞,然后MLE。这样是为了减少进入dfs函数的次数吗?