http://acm.hdu.edu.cn/showproblem.php?pid=1054

树形DP 主要是把思路屡清楚

选个根结点进行向下搜 每个点都有两种可能 放士兵还是不放

防止重复搜索就可以

#include<iostream>
#include<string>
#include<string.h>
#include<queue>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<map>

using namespace std;
const int N=2000;
int yans[N];//此点放士兵 以此点为根结点的树的放士兵最小值
int nans[N];//此点不放士兵 以此点为根结点的树的放士兵最小值
bool had[N];//建的链表为双向 所以不能回搜 用作标记
struct node
{
    struct tt *next;
}mem[N];
struct tt
{
    struct tt *next;
    int k;
};
inline void build(int i,int j)//建邻接表
{
    struct tt *t=new tt;
    t->k=j;
    t->next=mem[i].next;
    mem[i].next=t;
}
void freee(int n)//释放空间
{
    struct tt *t;
    for(int i=0;i<n;++i)
    {
        while(mem[i].next!=NULL)
        {
            t=mem[i].next;
            mem[i].next=t->next;
            delete(t);
        }
    }
}
int ydp(int x);
int ndp(int x)
{
    if(nans[x]!=-1)//防止重复
    return nans[x];
    struct tt *t=mem[x].next;
    nans[x]=0;//此点不放
   while(t!=NULL)
   {
      if(!had[t->k])
      {
          had[t->k]=true;
          nans[x]+=ydp(t->k);//此点不放 下边的点必须放
          had[t->k]=false;
      }
      t=t->next;
   }
   return nans[x];
}
int ydp(int x)
{
    if(yans[x]!=-1)
    return yans[x];
   struct tt *t=mem[x].next;
   yans[x]=1;//此点放
   while(t!=NULL)
   {
       if(!had[t->k])
       {
           had[t->k]=true;
           yans[x]+=min(ydp(t->k),ndp(t->k));//此点放 下边的点可放 可不放 取最小
           had[t->k]=false;
       }
      t=t->next;
   }
   return yans[x];
}
int main()
{

int n;
    while(scanf("%d",&n)!=EOF)
    {
        int i,j,m;
        for(int l=0;l<n;++l)
        {
             scanf("%d",&i);
             getchar();getchar();
             scanf("%d",&m);
             getchar();
             while(m--)
             {
                 scanf("%d",&j);
                 build(i,j);
                 build(j,i);
             }
        }
        memset(yans,-1,sizeof(yans));
        memset(nans,-1,sizeof(nans));
        memset(had,false,sizeof(had));
        had[0]=true;
        printf("%d\n",min(ydp(0),ndp(0)));//以0为根结点 取最小
        freee(n);
    }
    return 0;
}

转载于:https://www.cnblogs.com/liulangye/archive/2012/04/22/2465386.html

hdu 1054 Strategic Game相关推荐

  1. hdu 1054 Strategic Game 二分图最小点覆盖

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054 题意: 给出一个无向图,求最小点覆盖. 思路: 用网络流来做设立一个超级源点和一个超级汇点. 每 ...

  2. hdu 1054 Strategic Game 最小点覆盖 = 最大二分匹配

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1054 简单二分匹配,根据题意构造一个无向图.然后求最小点覆盖,然后扫描mark数组将曾经匹配的点所匹配 ...

  3. HDU——1054 Strategic Game

    Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  4. HDU 1054 Strategic Game 最小点覆盖

     最小点覆盖概念:选取最小的点数覆盖二分图中的所有边. 最小点覆盖 = 最大匹配数. 证明:首先假设我们求的最大匹配数为m,那么最小点覆盖必然 >= m,因为仅仅是这m条边就至少需要m个点.然后 ...

  5. HDU - 1054 Strategic Game(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一棵树,现在要在节点上放置士兵,每个士兵可以监视与其所在的节点直接相连的节点,问最少需要多少个士兵才能将整棵树都监视到 题目分析:求最少的节点,以保证每条边都有一个端 ...

  6. HDU - 1054 Strategic Game (二分图匹配模板题)

    二分图匹配模板题 #include <bits/stdc++.h> #define FOPI freopen("in.txt", "r", stdi ...

  7. hdu 1054(最小顶点覆盖)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054 思路:最小顶点覆盖 == 最大匹配(双向图)/2...不过一开始是用邻接矩阵,傻傻的TLE... ...

  8. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

  9. 算法学习经典例题整理

    陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...

最新文章

  1. A里正在拆中台,你还在建中台吗?
  2. SAP库存历史库存表更新逻辑
  3. [html] H5的video可以播放哪些类型的文件?可以播放rtsp流吗?
  4. (六)Neo4j综合项目
  5. 重写equals方法---java
  6. php pdo query 空判断,检查空结果(php,pdo,mysql)
  7. Java NIO学习与记录(七): Reactor单线程模型的实现
  8. 基于SSM的个人博客系统
  9. H264三种码率控制方法(CBR, VBR, CVBR,)CRF和CQP
  10. 迭代回溯的图最大团问题(可得到多组最优解)
  11. vue3中的vue-router简单实现以及router变迁带来的思考
  12. 图片上传几种方式总结
  13. 关于多个债权人申请执行同一被执行人的清偿顺序问题
  14. 高通骁龙410e/APQ8016E嵌入式物联网模块芯片
  15. IOS gif图片播放 swift
  16. IAR OF STM8 Error[Pe095]: array is too large
  17. 通往强人工智能,少不了的模拟大脑
  18. 未来人类将被AI取代?一文读懂人工智能类型与发展阶段
  19. 考虑风电经济调度的储能运行优化
  20. PHP防火墙代码,防火墙 firewall iptables(示例代码)

热门文章

  1. neoterm如何安装python_NeoTerm官方版v2.1.0下载_NeoTerm(21世纪的终端)下载-刷机之家
  2. python3.7怎么用_Python 3.7.0 来了!
  3. 大数据时代,海量数据处理常用思路和方法总结
  4. 大多数元素python_学Python必知的20个技巧,掌握它们,准没错
  5. oracle客户端查看版本号,Oracle 版本查看及版本号说明
  6. 系统学习深度学习(二十六)--BiRNN
  7. 图像局部特征(十三)--FREAK特征
  8. 计算机科学素养大赛,第六届全国大学生计算机应用能力与信息素养大赛圆满结束...
  9. 电脑太慢了最简单的办法怎么弄_修电脑不求人—最实用办公室电脑故障及解决办法,办公室人都说好...
  10. presto distinct用法