/*
题意:就是在一个图上放一个士兵他可以观察与之相连的边的情况。问最少要放多少个士兵可以观察所有边的情况。
我也不知道为啥就是二分图最小点覆盖,看了这个问题就往那里想。自己画个图还真是。
思路:
二分图的最小点覆盖,用最少的点覆盖所有边。
最小点覆盖等于=最大匹配数。
无向图最小点覆盖=最大匹配数/2
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<vector>
using namespace std;
#define MAX 1510
vector<int>G[MAX];
int n;
int vis[MAX];
int match[MAX];
int find(int x)
{
for(int i=0;i<G[x].size();i++)
{
if(!vis[G[x][i]])
{
vis[G[x][i]]=1;
if(match[G[x][i]]==-1||find(match[G[x][i]]))
{
match[G[x][i]]=x;
return 1;
}
}
}
return 0;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{ for(int i=1;i<=1510;i++)
{
G[i].clear();
}
for(int i=1;i<=n;i++)
{
int x,k;
scanf("%d:(%d)",&x,&k);
x++;
for(int j=1;j<=k;j++)
{
int y;
scanf("%d",&y);
y++;
G[x].push_back(y);
G[y].push_back(x);
}
}
memset(match,-1,sizeof(match));
int c=0;
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(find(i)) c++;
}
printf("%d\n",c/2);
}
}
hdu1054 最小点覆盖
最新推荐文章于 2021-08-11 06:38:52 发布