【题目】
题目描述:
样例数据:
【样例 1 1 1】
输入
8 6
0 2
2 3
3 5
1 4
1 6
3 1
输出
5
【样例 2 2 2】
输入
20 5
5 2
4 3
18 17
0 11
13 3
输出
16
【分析】
最大点独立集
把相互跳过舞的人连边,由于题目中要求出一个元素数量最大的集合,使得集合中的人相互都没有跳过舞,那就相当于在图中找出最大点独立集
而最大点独立集 = = = 总点数 − - − 最大匹配,因此连边跑最大流就可以了
要注意的是,最后的 a n s = n − m a x f l o w 2 ans=n-\frac{maxflow}{2} ans=n−2maxflow,因为 m a x f l o w maxflow maxflow 实际上重复计算了(若 ( x , y ) (x,y) (x,y) 是一对匹配,那 ( y , x ) (y,x) (y,x) 也算进去了)
【代码】
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1005
using namespace std;
int n,m,a[N][N],match[N];
bool vis[N];
bool find(int x)
{
int i;
for(i=1;i<=n;++i)
{
if(a[x][i]&&!vis[i])
{
vis[i]=true;
if(!match[i]||find(match[i]))
{
match[i]=x;
return true;
}
}
}
return false;
}
int main()
{
int x,y,i;
scanf("%d%d",&n,&m);
for(i=1;i<=m;++i)
{
scanf("%d%d",&x,&y);
a[++x][++y]=a[y][x]=1;
}
int ans=0;
for(i=1;i<=n;++i)
{
memset(vis,false,sizeof(vis));
if(find(i)) ans++;
}
printf("%d\n",n-ans/2);
return 0;
}