题目链接:##

传送门

题目大意:##

Bob非常享受玩电脑游戏的过程,尤其是策略游戏,但是在有些时候,他因为不能在第一时间找到最佳的策略而十分伤心。 现在,他遇到了一个问题。他必须保卫一个中世纪的城市,有很多道路将整个城市连起来,整体上看上去像一棵树。Bob需要放置尽可能少的士兵,保卫树上所有的边。士兵只能放在节点上,但是却可以保卫所有与这个节点相邻的边。

题目分析:##

由于树本身具有二分图的性质,所以这里我把树手动染色转成二分图,然后跑最小点覆盖

(当然也可以树形dp)

代码:##

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N (1500 + 5)
using namespace std;
inline int read(){
int cnt = 0, f = 1; char c;
c = getchar();
while (!isdigit(c)) {
if(c == '-') f = -f;
c = getchar();
}
while (isdigit(c)) {
cnt = cnt * 10 + c - '0';
c = getchar();
}
return cnt * f;
}
int n, nxt[2*N], to[2*N], first[2*N], tot, x, t, y, Float[N], cnt, black, white, ans, match[N];
bool vis[N];
struct node{
int x;int y;
}edge[N];
void add(int x, int y) {
nxt[++tot] = first[x];
first[x] = tot;
to[tot] = y;
}
void Dfs(int u){
for (register int i = first[u]; i; i = nxt[i]) {
int v = to[i];
if(!Float[v]) {
Float[v] = Float[u] + 1;
Dfs(v);
}
}
}
void build_map() {
memset (first, 0, sizeof(first));
memset (nxt, 0, sizeof(nxt));
memset (to, 0, sizeof(to));
tot = 0;
for (register int i = 1; i <= cnt; i++) {
int X = edge[i].x; int Y = edge[i].y;
if (Float[X] % 2 == 1) {
add(X, Y);
if (!vis[X]) {
vis[X] = true;
black++;
}
if (!vis[Y]) {
vis[Y] = true;
white++;
}
} else {
add(Y, X);
if (!vis[X]) {
vis[X] = true;
white++;
}
if (!vis[Y]) {
vis[Y] = true;
black++;
}
}
}
}
int find(int u) {
// cout<<u<<"##"<<endl;
for (register int i = first[u]; i; i = nxt[i]) {
int v = to[i];
// cout<<vis[v]<<" "<<v<<endl;
if (vis[v]) {
continue;
} else {
vis[v] = true;
if (match[v] == -1||find(match[v])) {
match[v] = u;
return 1;
}
}
}
return 0;
} int hungary() {
for (register int i = 1; i <= n; i++) match[i] = -1;
for (register int i = 1; i <= n; i++) {
for (register int j = 1; j <= n; j++) vis[j] = 0;
ans += find(i);
}
return ans;
} int main(){
while(scanf("%d", &n) != EOF) {
memset(first, 0, sizeof(first));
memset(nxt, 0, sizeof(nxt));
memset(to, 0, sizeof(to));
memset(Float, 0, sizeof(Float));
memset(vis, 0, sizeof(vis));
tot=0; cnt=0; ans=0;
for (register int i = 1; i <= n; i++) {
x = read();
t = read();
for (register int j = 1; j <= t; j++) {
y = read();
edge[++cnt].x = x+1;
edge[cnt].y = y+1;
add(x+1,y+1);
add(y+1,x+1);
}
}
Float[1] = 1;
Dfs(1);
build_map();
// cout<<black<<" "<<white<<endl;
// for(register int i = 1; i <= n; i++) cout<<Float[i];
int res = hungary();
printf("%d\n", res);
} return 0;
}

[POJ1463] Strategic game的更多相关文章

  1. poj1463 Strategic game (树状dp)

    Strategic game Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 5498   Accepted: 2484 De ...

  2. poj1463 Strategic game【树形DP】

    Strategic game Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 9582   Accepted: 4516 De ...

  3. POJ1463 Strategic game (最小点覆盖 or 树dp)

    题目链接:http://poj.org/problem?id=1463 给你一棵树形图,问最少多少个点覆盖所有的边. 可以用树形dp做,任选一点,自底向上回溯更新. dp[i][0] 表示不选i点 覆 ...

  4. poj1463 Strategic game[树形DP]

    求一棵树每条边都被选上的点覆盖掉的最少选点数. 一条边被覆盖掉,必须他父亲和儿子中选一个..这不就是比NOIP2018D2T3还裸的暴力么.水掉. lyd给的练习题都什么**玩意儿.. code不挂了 ...

  5. 树形DP入门题目推荐以及解析

    关于树形DP几道入门题目 今天恶补树形DP,感觉海星. 其实挺简单的. 介绍几道例题,我会的. 1.洛谷P1352 没有上司的舞会 我的一篇题解 我们可以考虑每一个节点都是有两种情况. 一个是被邀请: ...

  6. POJ1463:Strategic game(树形DP)

    Description Bob enjoys playing computer games, especially strategic games, but sometimes he cannot f ...

  7. Strategic game树形DP解法(Poj1463,Uva1292)

    已经写过本题用二分图的做法,见这儿. 本题的图是一棵树,求最小点覆盖也可以用树形DP的做法. 定义状态f[0/1][u]表示以u为根的子树,u选取/不选最少需要选取多少点来覆盖. 显然 f[0][u] ...

  8. Strategic game(无向?)二分图最小点覆盖(Poj1463,Uva1292)

    原题链接 此题求二分图的最小点覆盖,数值上等于该二分图的最大匹配.得知此结论可以将图染色,建有向图,然后跑匈牙利/网络流,如下.然而... #include<iostream> #incl ...

  9. HDU1054 Strategic Game——匈牙利算法

    Strategic Game Bob enjoys playing computer games, especially strategic games, but sometimes he canno ...

随机推荐

  1. 驱动框架入门——以LED为例[【转】

    本文转载自;http://blog.csdn.net/oqqHuTu12345678/article/details/72783903 以下内容源于朱有鹏<物联网大讲堂>课程的学习,如有侵 ...

  2. Redis雪崩效应以及解决方案

    缓存雪崩产生的原因 缓存雪崩通俗简单的理解就是:由于原有缓存失效(或者数据未加载到缓存中),新缓存未到期间(缓存正常从Redis中获取,如下图)所有原本应该访问缓存的请求都去查询数据库了,而对数据库C ...

  3. 关于AngularJs中监听事件及脏循环的理解

    可能很多刚入行或者刚学习的前端对于AngularJs中的一些事件或者概念感觉不理解或者没有思路,今天让我们一起来剖析一下AngularJs中的一些事件. AngularJs中对于的监听事件会用到一个s ...

  4. cannot find -lbz2 解决方法

    sudo yum install -y bzip2* 或者sudo apt-get install bzip2* 还是报错就找到libbz2.so.1,建立连接或者复制到 /usr/lib/libbz ...

  5. zoj 2315 New Year Bonus Grant 解题报告

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1315 题目意思:Bill Hates 是公司的老总,她管辖着很多程序 ...

  6. 【转载】Java的接口和抽象类

    尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3811437.html 也不知道,面试为什么经常用到这个知识点—— 一.抽象类 在了 ...

  7. awk实现求和、平均、最大值和最小值的计算操作

    0.准备和数据文件 比如有一个数据文件,只有一列(在之前可以通过各种手段过滤出只有数字这一列),比如操作的响应时间 Txt代码  490898  1189235  20212  1494270  14 ...

  8. UVA-10534 (LIS)

    题意: 给定一个长为n的序列,求一个最长子序列,使得该序列的长度为2*k+1,前k+1个数严格递增,后k+1个数严格单调递减; 思路: 可以先求该序列最长单调递增和方向单调递增的最长序列,然后枚举那第 ...

  9. rkhunter和chkrootkit

    今天继续检查我的Linux,所以下来rkhunter和chkrootkit一个一个来,下面只记录命令,少些说明不截图了. 1.rkhunter #cd /temp #wget http://downl ...

  10. 如何应用 AutoIt 修改本机的防火墙配置?(开启,关闭防火墙,添加程序信任到防火墙)

    以前,公司的实施人员配置好项目之后,不同的机器之间经常性的无法建立链接,后来发现是防火墙的设置.虽然是个小问题,但是经常性的忘记这个配置. 现在,我决定把对防火墙的设置,加入到我给实施人员的配置工具中 ...