题目
思路
- 行列图:二分图经典模型,令行为左侧点,列为右侧点
- 有同学的格子就在对应行列之间连一条边
- 那么问题就转化为 二分图上最大的最大独立集问题
- 最大独立集点数=总点数-最大匹配数 匈牙利算法即可
- 注释里面有匈牙利算法讲解qwq
代码
#include <bits/stdc++.h>
using namespace std;
#define N 1005
#define X 4005
int n,x,tot;
int head[N],Next[X],to[X],f[X];
bool v[X];
inline void add(int x,int y){
to[++tot] = y;
Next[tot] = head[x];
head[x] = tot;
}
inline bool find(int x){
for(int i=head[x]; i; i=Next[i]){
int y = to[i];
if(v[y]) continue;
v[y] = true;
if(!f[y] || find(f[y])){
f[y] = x;
return true;
}
}
return false;
}
int main()
{
scanf("%d %d",&n,&x);
for(int i=1,xi,yi; i<=x; i++){
scanf("%d %d",&xi,&yi);
add(xi,yi+n) ;
}
int ans = 0;
for(int i=1; i<=n; i++){
memset(v,0,sizeof(v));
if(find(i)) ++ans;
}
printf("%d",2*n*n-ans*n);
return 0;
}