题目:给你一棵树。找到最小的顶点集合,使得全部的边至少有一个顶点在这个集合中。

分析:树形dp,图论,最小顶点覆盖。

方案1:树形dp。分别记录每一个节点取和不取的最优解f(k。0)与f(k,1);

每一个节点的状态取决于子树,子树的根都不选,则他必选;否则取最小;

f(k。0)= sum(f(i,1))。

f(k。1)= sum(min(f(i,0)。f(i。1))){ 当中 i 是k的子树根节点 };

方案2:最小顶点覆盖 = N - 最大独立点 = 最大匹配。

说明:(2011-09-19 09:46)。

#include <stdio.h>
#include <stdlib.h>
#include <string.h> #define min(x,y) ((x)<(y)?(x):(y)) typedef struct node
{
int Count;
int Value;
int Next[ 10 ];
}node;
node Node[ 1510 ];
int Root; typedef struct answ
{
int sum0;
int sum1;
}Answ;
Answ Save; Answ dp( int Root )
{
Answ an;
an.sum0 = 0;
an.sum1 = 1;
if ( Node[ Root ].Count ) {
for ( int i = 0 ; i < Node[ Root ].Count ; ++ i ) {
Save = dp( Node[ Root ].Next[ i ] );
an.sum0 += Save.sum1;
an.sum1 += min( Save.sum0, Save.sum1 );
}
}
return an;
} int main()
{
int n,a,m,b;
while ( scanf("%d",&n) != EOF ) {
Root = -1;
memset( Node, 0, sizeof( Node ) );
for ( int i = 0 ; i < n ; ++ i ) {
scanf("%d:(%d)",&a,&m);
if ( Root == -1 ) Root = a;
Node[ a ].Count = m;
Node[ a ].Value = a;
for ( int j = 0 ; j < m ; ++ j ) {
scanf("%d",&b);
Node[ a ].Next[ j ] = b;
}
}
Answ answer = dp( Root );
printf("%d\n",min( answer.sum0, answer.sum1 ));
}
return 0;
}

图论解法:

#include <stdio.h>
#include <stdlib.h> typedef struct node
{
int Point;
node* Next;
}node;
node Node[ 3001 ];
node *Head[ 1501 ];
bool Used[ 1501 ];
int Result[ 1501 ]; bool find( int a, int n )
{
for ( node *P = Head[ a ] ; P ; P = P->Next )
if ( !Used[ P->Point ] ) {
Used[ P->Point ] = true;
if ( Result[ P->Point ] == -1 || find( Result[ P->Point ] , n ) ) {
Result[ P->Point ] = a;
return true;
}
}
return false;
} int argument( int n )
{
for ( int i = 0 ; i < n ; ++ i )
Result[ i ] = -1;
int Count = 0;
for ( int i = 0 ; i < n ; ++ i ) {
for ( int j = 0 ; j < n ; ++ j )
Used[ j ] = false;
if ( find( i, n ) )
++ Count;
}
return Count;
} int main()
{
int n,a,m,b;
while ( scanf("%d",&n) != EOF ) {
for ( int i = 0 ; i < n ; ++ i )
Head[ i ] = NULL;
int Count = 0;
for ( int i = 0 ; i < n ; ++ i ) {
scanf("%d:(%d)",&a,&m);
for ( int j = 0 ; j < m ; ++ j ) {
scanf("%d",&b);
Node[ Count ].Next = Head[ a ];
Node[ Count ].Point = b;
Head[ a ] = &Node[ Count ++ ];
Node[ Count ].Next = Head[ b ];
Node[ Count ].Point = a;
Head[ b ] = &Node[ Count ++ ];
}
}
printf("%d\n",argument( n )/2);
}
return 0;
}

zoj 1134 - Strategic Game的更多相关文章

  1. 一位学长的ACM总结(感触颇深)

    发信人: fennec (fennec), 信区: Algorithm 标 题: acm 总结 by fennec 发信站: 吉林大学牡丹园站 (Wed Dec 8 16:27:55 2004) AC ...

  2. POJ题目细究

    acm之pku题目分类 对ACM有兴趣的同学们可以看看 DP:  1011   NTA                 简单题  1013   Great Equipment     简单题  102 ...

  3. 【转】POJ百道水题列表

    以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...

  4. ZOJ People Counting

    第十三届浙江省大学生程序设计竞赛 I 题, 一道模拟题. ZOJ  3944http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=394 ...

  5. ZOJ 3686 A Simple Tree Problem

    A Simple Tree Problem Time Limit: 3 Seconds      Memory Limit: 65536 KB Given a rooted tree, each no ...

  6. ZOJ Problem Set - 1394 Polar Explorer

    这道题目还是简单的,但是自己WA了好几次,总结下: 1.对输入的总结,加上上次ZOJ Problem Set - 1334 Basically Speaking ac代码及总结这道题目的总结 题目要求 ...

  7. ZOJ Problem Set - 1392 The Hardest Problem Ever

    放了一个长长的暑假,可能是这辈子最后一个这么长的暑假了吧,呵呵...今天来实验室了,先找了zoj上面简单的题目练练手直接贴代码了,不解释,就是一道简单的密文转换问题: #include <std ...

  8. ZOJ Problem Set - 1049 I Think I Need a Houseboat

    这道题目说白了是一道平面几何的数学问题,重在理解题目的意思: 题目说,弗雷德想买地盖房养老,但是土地每年会被密西西比河淹掉一部分,而且经调查是以半圆形的方式淹没的,每年淹没50平方英里,以初始水岸线为 ...

  9. ZOJ Problem Set - 1006 Do the Untwist

    今天在ZOJ上做了道很简单的题目是关于加密解密问题的,此题的关键点就在于求余的逆运算: 比如假设都是正整数 A=(B-C)%D 则 B - C = D*n + A 其中 A < D 移项 B = ...

随机推荐

  1. 省部级干部list

    省部级干部表 省(市.自治区) 省(市)委书记 省(市)人大主任 省(市)长 省(市)政协主席 北京市 郭金龙 杜德印 王安顺 吉林 天津市 黄兴国 肖怀远 黄兴国 臧献甫 上海市 韩正 殷一璀(女) ...

  2. cocos2dx进阶学习之瓦片地图编辑器

    之前学习了瓦片地图类,现在我们来学习下瓦片地图制作工具 这个是开源的工具,可以从网上下载,下面我们演示下怎么做地图 步骤1 将需要用到的图片放到一个目录下,比如我机器上就是d:\tiled,这些图片是 ...

  3. codeblocks快捷键及设置

    ==日常编辑== • 按住Ctrl滚滚轮,代码的字体会随你心意变大变小.• 在编辑区按住右键可拖动代码,省去拉(尤其是横向)滚动条之麻烦:相关设置:Mouse Drag Scrolling.• Ctr ...

  4. linux之文本编辑器

    [目标] 管理员在进行系统操作的时候,不可避免地会对文本进行修改,如进行各种服务程序配置文件的修改,使程序对用户提供不同的服务效果.在本章我们向大家介绍Linux上常见的编辑器ed.vi.emacs, ...

  5. 一个轻client,多语言支持,去中心化,自己主动负载,可扩展的实时数据写服务的实现方案讨论

    背景 背景是设计一个实时数据接入的模块,负责接收client的实时数据写入(如日志流,点击流),数据支持直接下沉到HBase上(兴许提供HBase上的查询),或先持久化到Kafka里.方便兴许进行一些 ...

  6. LeetCode——Length of Last Word

    Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the l ...

  7. list,map的疑问

    代码: package com.wyl; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator ...

  8. <climits>头文件使用方法

    <climits>头文件定义的符号常量 CHAR_MIN  char的最小值SCHAR_MAX  signed char 最大值SCHAR_MIN   signed char 最小值UCH ...

  9. 使用Android studio下载github上的工程及问题解决

    Android studio内置了github的插件,可以直接下载github上的工程,感觉好爽啊.具体怎么做呢?1.如图所示操作,如果是初次使用会提示输入用户名密码. 2.等android stud ...

  10. MapReduce调度与执行原理之任务调度(续)

    前言 :本文旨在理清在Hadoop中一个MapReduce作业(Job)在提交到框架后的整个生命周期过程,权作总结和日后参考,如有问题,请不吝赐教.本文不涉及Hadoop的架构设计,如有兴趣请参考相关 ...