https://www.luogu.org/problemnew/show/P1640
luogu数据真心水。
对于这种要多次二分图匹配的,可以把vis数组定义成一个int型的,加一个时间戳,然后dfs的时候只需判定是否这个时间遍历过这个点,然后就可以了。不用多次memset。操作神奇。
#include<cstdio>
#include<cstring>
using namespace std;
int n,ecnt;
const int N=1000005;
int head[N],match[N];
struct Edge{
int to,nxt;
}e[N<<1];
int vis[N],tim;
void add(int bg,int ed){
e[++ecnt].nxt=head[bg];
e[ecnt].to=ed;
head[bg]=ecnt;
}
bool dfs(int x){
if(vis[x]==tim)return 0;
vis[x]=tim;
for(int i=head[x];i;i=e[i].nxt){
int v=e[i].to;
if(!match[v]||dfs(match[v])){
match[v]=x;
return 1;
}
}
return 0;
}
int main() {
scanf("%d",&n);
for(int i=1,a,b;i<=n;i++){
scanf("%d%d",&a,&b);
add(a,i);
add(b,i);
}
int ans=0;
for(int i=1;i<=1000000;i++){
tim++;
if(dfs(i))ans++;
else break;
}
printf("%d",ans);
}