您的位置:首页 > 其它

poj 3342 树形dp

2015-07-20 10:51 393 查看
还是简单的树形dp,不过要判断最优解是否有多种。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
using namespace std;

const int N = 201;
int head
;
int dp
[2];
bool flag
[2];
int n, e, cnt;
map<string, int> mp;

struct Edge
{
int v, next;
} edge
;

void addEdge( int u, int v )
{
edge[e].v = v;
edge[e].next = head[u];
head[u] = e++;
}

void dfs( int u )
{
dp[u][0] = 0, dp[u][1] = 1;
for ( int i = head[u]; i != -1; i = edge[i].next )
{
int v = edge[i].v;
dfs(v);
dp[u][1] += dp[v][0];
if ( flag[v][0] )
{
flag[u][1] = true;
}
if ( dp[v][0] > dp[v][1] )
{
dp[u][0] += dp[v][0];
if ( flag[v][0] )
{
flag[u][0] = true;
}
}
else if ( dp[v][0] < dp[v][1] )
{
dp[u][0] += dp[v][1];
if ( flag[v][1] )
{
flag[u][0] = true;
}
}
else
{
dp[u][0] += dp[v][0];
flag[u][0] = true;
}
}
}

char str1
, str2
;

int main ()
{
while ( scanf("%d", &n), n )
{
e = 0;
cnt = 1;
memset( head, -1, sizeof(head) );
mp.clear();
scanf("%s", str1);
mp[str1] = cnt++;
for ( int i = 1; i < n; i++ )
{
scanf("%s%s", str1, str2);
if ( mp.count(str1) == 0 )
{
mp[str1] = cnt++;
}
if ( mp.count(str2) == 0 )
{
mp[str2] = cnt++;
}
addEdge( mp[str2], mp[str1] );
}
memset( flag, false, sizeof(flag) );
dfs(1);
if ( dp[1][0] > dp[1][1] )
{
printf("%d", dp[1][0]);
if ( !flag[1][0] )
printf(" Yes\n");
else
printf(" No\n");
}
else if ( dp[1][1] > dp[1][0] )
{
printf("%d", dp[1][1]);
if ( !flag[1][1] )
printf(" Yes\n");
else
printf(" No\n");
}
else
{
printf("%d No\n", dp[1][0]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: