这题的题意就是给出一张有向图,求这张图的最大独立集。
考虑最大独立集,我们想到了二分图,最大独立集=点数-最大匹配数。
然后这题就非常简单了,随便套个匈牙利切掉就行了。
附:关于一些二分图问题的解题思路:
- 最小点覆盖(每条边至少一个顶点在集合里)=最大匹配。
- 最小边覆盖(每个点至少连一条边)=总点数-最大匹配。
- 最大独立集(集合内的点互不相连)=点数-最大匹配。
总点数和点数好像有点区别的吧……
附上AC代码:
#include <cstdio>
#include <cstring>
#define N 110
using namespace std;
int n,m,x,y,map[N][N],ans,v[N];
bool b[N];
inline bool so(int now){
for (int i=1; i<=n; ++i)
if (now!=i&&map[now][i]&&!b[i]){
b[i]=1;
if (!v[i]||so(v[i])){
v[i]=now;
return 1;
}
}
return 0;
}
int main(void){
scanf("%d%d",&n,&m);
for (int i=1; i<=m; ++i) scanf("%d%d",&x,&y),map[x][y]=1;
for (int k=1; k<=n; ++k)
for (int i=1; i<=n; ++i)
for (int j=1; j<=n; ++j)
map[i][j]|=(map[i][k]&map[k][j]);
for (int i=1; i<=n; ++i){
memset(b,0,sizeof b);
if (so(i)) ++ans;
}
printf("%d",n-ans);
return 0;
}