您的位置:首页 > 其它

UVa 1292 - Strategic game

2013-05-04 08:59 113 查看
有两种做法:一种是经典二分图最小顶点覆盖,一种是树形DP,我用的后者。

第一次学习树形DP……

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <algorithm>

using namespace std;

const int MAXN = 1600;

int N, root;
int dp[MAXN][2];
vector<int> tree[MAXN];

void init()
{
root = -1;

for ( int i = 0; i < N; ++i )
{
int u, cnt;
tree[i].clear();
scanf("%d:(%d)", &u, &cnt );
if ( root == -1 ) root = u;
for ( int j = 0; j < cnt; ++j )
{
int v;
scanf( "%d", &v );
tree[u].push_back(v);
}
}
return;
}

int DFS( int fa )
{
dp[fa][0] = 0;
dp[fa][1] = 1;
int len = tree[fa].size();
for ( int i = 0; i < len; ++i )
{
int v = tree[fa][i];
DFS( v );
dp[fa][0] += dp[v][1];
dp[fa][1] += min( dp[v][0], dp[v][1] );
}
return min( dp[fa][0], dp[fa][1] );
}

int main()
{
while ( scanf( "%d", &N ) == 1 )
{
init();
printf( "%d\n", DFS(root) );
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: