hdu 1068 Girls and Boys 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068
图论 匈牙利算法?
题目大意:给你每个人互相认识的人,然后问最多能找到多少个人都互不认识。其实就是找:最大独立集合!
题目分析:计算匹配总人数,除以二就是最大匹配数
已知:二分图最大独立集合 = 节点数 - 最大匹配数code:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define N 501
int n,match[N];
bool g[N][N],mark[N];
bool find(int x)
{
int i;
for(i=0;i<n;i++)
{
if(g[x][i]&&!mark[i])
{
mark[i]=true;//标记这一点走过了
if(match[i]==-1||find(match[i]))
{
match[i]=x;//匹配的真正含义
return true;
}
}
}
return false;
}
int main()
{
int i,j,x,y,m,sum;
while(cin>>n)
{
sum=0;
memset(g,false,sizeof(g));
memset(match,-1,sizeof(match));
for(i=0;i<n;i++)
{
scanf("%d: (%d)",&x,&m);
while(m--)
{
cin>>y;
g[x][y]=true;
}
}//邻接矩阵初始化
for(i=0;i<n;i++)
{
memset(mark,false,sizeof(mark));
if(find(i))sum++;
}
printf("%d\n",n-sum/2);
}
return 0;
} Exe.Time:1015MS Exe.Memory:580K Code Len:783B
PS:又是思路代码全抄的大神,自己做就无解了……
本文解析了 HDU 1068 题目,利用匈牙利算法解决最大独立集问题。通过计算二分图的最大匹配数来找到解,提供了完整的 C++ 实现代码。

被折叠的 条评论
为什么被折叠?



