题意很简单,在一颗树上找最小点覆盖。

将树染成黑白两色,构成一张二分图,然后最大匹配==最小点覆盖即可,所以一次匈牙利就可以求出来了

hdu1054

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <string>
#include <queue>
#include <vector>
#include <stdlib.h>
using namespace std;
#define N 1505 int n;
struct node
{
int to,next;
}edge[N*]; vector<int>g[N]; int pre[N],cnt;
int cao[N],a[N],b[N];
int cnta,cntb;
int mark[N],frt[N]; void add_edge(int u,int v)
{
edge[cnt].to=v;
edge[cnt].next=pre[u];
pre[u]=cnt++;
} void Dfs(int s,int fr,int flag)
{
if(flag==)
{
cao[s]=cnta;
a[cnta]=s;
cnta++;
}else
{
cao[s]=cntb;
b[cntb]=s;
cntb++;
}
for(int p=pre[s];p!=-;p=edge[p].next)
{
int v=edge[p].to;
if(v==fr) continue;
Dfs(v,s,flag^);
}
} int dfs(int s)
{
for(int i=;i<g[s].size();i++)
{
int v=g[s][i];
if(mark[v]==) continue;
mark[v]=;
if(frt[v]==-||dfs(frt[v]))
{
frt[v]=s;
return ;
}
}
return ;
} int main()
{
while(scanf("%d",&n)!=EOF)
{
cnt=;
memset(pre,-,sizeof(pre));
for(int i=;i<n;i++)
{
int x;
scanf("%d",&x);
int num;
scanf(":(%d)",&num);
for(int j=;j<num;j++)
{
int y;
scanf("%d",&y);
add_edge(x,y);
add_edge(y,x);
}
}
//然后就是染色了
cnta=; cntb=;
Dfs(,-,);
//然后再建一张图
for(int i=;i<cnta;i++)
{
g[i].clear();
for(int p=pre[a[i]];p!=-;p=edge[p].next)
{
int v=edge[p].to;
g[i].push_back(cao[v]);
}
}
int ans=;
memset(frt,-,sizeof(frt));
for(int i=;i<cnta;i++)
{
memset(mark,,sizeof(mark));
ans+=dfs(i);
}
printf("%d\n",ans);
}
return ;
}

hdu1054(二分图匹配)的更多相关文章

  1. UVA 12549 - 二分图匹配

    题意:给定一个Y行X列的网格,网格种有重要位置和障碍物.要求用最少的机器人看守所有重要的位置,每个机器人放在一个格子里,面朝上下左右四个方向之一发出激光直到射到障碍物为止,沿途都是看守范围.机器人不会 ...

  2. POJ 1274 裸二分图匹配

    题意:每头奶牛都只愿意在她们喜欢的那些牛栏中产奶,告诉每头奶牛愿意产奶的牛棚编号,求出最多能分配到的牛栏的数量. 分析:直接二分图匹配: #include<stdio.h> #includ ...

  3. BZOJ1433 ZJOI2009 假期的宿舍 二分图匹配

    1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2375  Solved: 1005[Submit][Sta ...

  4. HDU1281-棋盘游戏-二分图匹配

    先跑一个二分图匹配,然后一一删去匹配上的边,看能不能达到最大匹配数,不能这条边就是重要边 /*----------------------------------------------------- ...

  5. HDU 1083 网络流之二分图匹配

    http://acm.hdu.edu.cn/showproblem.php?pid=1083 二分图匹配用得很多 这道题只需要简化的二分匹配 #include<iostream> #inc ...

  6. hdu 5727 Necklace dfs+二分图匹配

    Necklace/center> 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5727 Description SJX has 2*N mag ...

  7. BZOJ 1059 & 二分图匹配

    题意: 判断一个黑白染色的棋盘能否通过交换行或列使对角线上都是黑色. SOL: 真是有点醉...这种问题要么很神要么很水...第一眼感觉很水但就是不造怎么做...想了10分钟怎么感觉就是判断个数够不够 ...

  8. 【POJ 3020】Antenna Placement(二分图匹配)

    相当于用1*2的板覆盖给定的h*w的格子里的点,求最少的板.可以把格子相邻的分成两个集合,如下图,0为一个集合,1的为一个,也就是(行数+列数)为奇数的是一个集合,为偶数的为另一个集合.1010101 ...

  9. BZOJ-1143&&BZOJ-2718 祭祀river&&毕业旅行 最长反链(Floyed传递闭包+二分图匹配)

    蛋蛋安利的双倍经验题 1143: [CTSC2008]祭祀river Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1901 Solved: 951 ...

随机推荐

  1. Nginx负载均衡介绍

    Nginx真心牛逼 nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态.静态页面的分离,可以按照轮询.ip哈希.URL哈希.权重等多种方式 ...

  2. hdu 1698 线段树 区间修改

    #include <cstdio> #include <cstdlib> #include <cmath> #include <map> #includ ...

  3. 如何理解JS项目

    JS API(DOM/PhoneGap/Cordova/NodeJS/Library/Android/MongoDB....)最基础,可以看懂一行代码. -------> JS OOP, JS语 ...

  4. ZOJ3550 Big Keng(三分)

    题意:给定一个立体的图形,上面是圆柱,下面是圆台,圆柱的底面半径和圆台的上半径相等,然后体积的V时,问这个图形的表面积最小可以是多少.(不算上表面).一开始拿到题以为可以YY出一个结果,就认为它是圆锥 ...

  5. App自适应

    http://blog.csdn.net/newjueqi/article/details/42779221

  6. lintcode:字符串置换

    题目 给定两个字符串,请设计一个方法来判定其中一个字符串是否为另一个字符串的置换. 置换的意思是,通过改变顺序可以使得两个字符串相等. 样例 "abc" 为 "cba&q ...

  7. Project Euler 101 :Optimum polynomial 最优多项式

    Optimum polynomial If we are presented with the first k terms of a sequence it is impossible to say ...

  8. 什么是A股、B股、H股、蓝筹股、红筹股

    A股 A股的正式名称是人民币普通股票.它是由我同境内的公司发行,供境内机构.组织或个人(不含台.港.澳投资者)以人民币认购和交易的普通股股票,我国A股股票市场经过几年快速发展,已经初具规模. B股 B ...

  9. EXT实现表格斑马线

    Ext.grid.GridPanel 单双行颜色样式(斑马线)2014-04-03 11:25 1078人阅读 评论(0) 收藏 举报分类:ExtJs(36)Ext.grid.GridPanel st ...

  10. JVM垃圾回收机制总结(5) :JDK垃圾收集器的配置命令

    以下配置主要针对分代垃圾回收算法而言. 堆大小设置 年轻代的设置很关键 JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理 ...