您的位置:首页 > 其它

HDU 1054 Strategic Game

2016-02-25 17:02 411 查看
题意:给定一个图每一个点能够观察到相邻的所有点,问最少需要多少个顶点就能够覆盖整个图。

思路:最小顶点覆盖问题,很基础,直接建图求最大匹配然后/2得答案,二分图的最小顶点覆盖直接就是最大匹配数。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
using namespace std;

struct node
{
int v;
int next;
}d[1000000];
int head[2500];
int vis[2500];
int pre[2500];
int cnt;
void add(int x,int y)
{
d[cnt].v=y;
d[cnt].next=head[x];
head[x]=cnt++;
}
int dfs(int u)
{
for(int i=head[u];i!=-1;i=d[i].next)
{
int v=d[i].v;
if(!vis[v])
{
vis[v]=1;
if(pre[v]==-1||dfs(pre[v]))
{
pre[v]=u;
return 1;
}
}
}
return 0;
}
int main()
{
int n,x,y,m;
while(~scanf("%d",&n))
{
memset(head,-1,sizeof(head));
memset(pre,-1,sizeof(pre));
cnt=0;
int ans=0;
for(int i=0;i<n;i++)
{
scanf("%d:(%d)",&x,&m);
for(int j=0;j<m;j++)
{
scanf("%d",&y);
add(x,y);
add(y,x);
}
}
for(int i=0;i<n;i++)
{
memset(vis,0,sizeof(vis));
ans += dfs(i);
}
printf("%d\n",ans/2);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: