zoj 1134 - Strategic Game
题目:给你一棵树。找到最小的顶点集合,使得全部的边至少有一个顶点在这个集合中。
分析:树形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的更多相关文章
- 一位学长的ACM总结(感触颇深)
发信人: fennec (fennec), 信区: Algorithm 标 题: acm 总结 by fennec 发信站: 吉林大学牡丹园站 (Wed Dec 8 16:27:55 2004) AC ...
- POJ题目细究
acm之pku题目分类 对ACM有兴趣的同学们可以看看 DP: 1011 NTA 简单题 1013 Great Equipment 简单题 102 ...
- 【转】POJ百道水题列表
以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...
- ZOJ People Counting
第十三届浙江省大学生程序设计竞赛 I 题, 一道模拟题. ZOJ 3944http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=394 ...
- ZOJ 3686 A Simple Tree Problem
A Simple Tree Problem Time Limit: 3 Seconds Memory Limit: 65536 KB Given a rooted tree, each no ...
- ZOJ Problem Set - 1394 Polar Explorer
这道题目还是简单的,但是自己WA了好几次,总结下: 1.对输入的总结,加上上次ZOJ Problem Set - 1334 Basically Speaking ac代码及总结这道题目的总结 题目要求 ...
- ZOJ Problem Set - 1392 The Hardest Problem Ever
放了一个长长的暑假,可能是这辈子最后一个这么长的暑假了吧,呵呵...今天来实验室了,先找了zoj上面简单的题目练练手直接贴代码了,不解释,就是一道简单的密文转换问题: #include <std ...
- ZOJ Problem Set - 1049 I Think I Need a Houseboat
这道题目说白了是一道平面几何的数学问题,重在理解题目的意思: 题目说,弗雷德想买地盖房养老,但是土地每年会被密西西比河淹掉一部分,而且经调查是以半圆形的方式淹没的,每年淹没50平方英里,以初始水岸线为 ...
- ZOJ Problem Set - 1006 Do the Untwist
今天在ZOJ上做了道很简单的题目是关于加密解密问题的,此题的关键点就在于求余的逆运算: 比如假设都是正整数 A=(B-C)%D 则 B - C = D*n + A 其中 A < D 移项 B = ...
随机推荐
- JAVA中IO和异常处理练习
1.SystemI\O练习:1)通过键盘输入若干字符,并通过显示器输出:2)定义一个静态方法validOrNot()用于对输入的字符进行合法性校验,若包含非英文字符,则抛出IllegalStringE ...
- Objective-C 类,实例成员,静态变量,对象方法,类方法(静态方法),对象,
Objective-C 类,实例成员,静态变量,对象方法,类方法(静态方法),对象, 一.类 在ios中,类的声明和实现时分离的,也就是说不能写在同一个文件中,声明放在 .h文件中,实现放在 .m 文 ...
- 第二种:NSObject
- (void)viewDidLoad { [super viewDidLoad]; /** * 开启子线程的方式之一:NSObject */ // 第一个参数:selector // 第二个参数:方 ...
- Matrix Factorization, Algorithms, Applications, and Avaliable packages
矩阵分解 来源:http://www.cvchina.info/2011/09/05/matrix-factorization-jungle/ 美帝的有心人士收集了市面上的矩阵分解的差点儿全部算法和应 ...
- Android:源码环境编译自定义的APP到ROM(System Image)中
有时候我们需要在源码环境中增加自己的应用或模块,随ROM一起发布. 下面讲述相关步骤: 1. 首先可以在SDK环境下进行编码设计(如果你的APP不涉及到emulator无法模拟的硬件的话) 也可以参考 ...
- iOS7支持九宫格
Beta4支持九宫格 还没试,等最终版把,现在的有很多bug还比较费电 看网上有人说虽然终于出来了但是还是不如百度搜狗等输入法方便 前几个月在weiphone上还有人问支不支持结果回帖的都说没戏 这算 ...
- 五张图概括 什么是 ASP 、 ASP.NET (Web Pages,Web Forms ,MVC )
当你看懂下面这五张图,我相信你对于学习.NET Web开发路线将不陌生! 来源: http://www.w3 ...
- ognl中的#、%和$
多学点,谢谢兄弟 原文地址:ognl中的#.%和$作者:百合 ognl中的#.%和$ #.%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分.在这里笔者简单介绍它们的相 ...
- KVM的虚拟化研究及应用
引言 虚拟化技术是IBM在20世纪70年代首先应用在IBM/370大型机上,这项技术极大地提高了大型机资源利用率.随着软硬件技术的迅速发展,这项属于大型机及专利的技术开始在普通X86计算机上应用并成为 ...
- [置顶] 自定义java Annotation快速入门与提高
我们先来看看一个简单的注解类定义 import java.lang.annotation.Documented; import java.lang.annotation.Retention; impo ...