这道题就很玄学了,我们将行看做一群点集,把列又看做一群点集,然后所谓的不好惹的同学就是该行和该列只能选一个,那么我们将这两个点连起来,然后呢就发现是一个二分图的最大独立集,然后呢用匈牙利算出最大点集然后呢剪一下就OK
#include<bits/stdc++.h>
using namespace std;
int n,k,ans;
int vis[1005],a[1005];
set<int>mapa[1005];
int dfs(int x){
for(set<int>::iterator it=mapa[x].begin();it!=mapa[x].end();it++){
if(vis[*it]==0){
vis[*it]=1;
if(a[*it]==0||dfs(a[*it])){
a[*it]=x;
return 1;
}
}
}
return 0;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=k;i++){
int x,y;
scanf("%d%d",&x,&y);
mapa[x].insert(y);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) vis[j]=0;
if(dfs(i))ans++;
}
printf("%d",(2*n-ans)*n);
return 0;
}