您的位置:首页 > 大数据 > 人工智能

MZ Training 2014 #5 D题

2014-10-09 16:35 162 查看
树形dp差点忘完了



题目要求每条边都必须有士兵在端点监视—— -_-尼玛每条边只有两个端点啊!!!就是每条边必须至少有一个端点被标记,然后求被标记的最少个数嘛!

经典嘞,赤果果嘞树形dp。没啥好说的。

<span style="font-size:18px;color:#33ff33;background-color: rgb(255, 0, 0);">#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
int n;
int in[1510];
int dp[2][1510];
bool vis[2][1510];
int head[1510];
struct edge
{
int v,next;
}e[2300010];
int k=1;
void adde(int u,int v)
{
e[k].v=v;
e[k].next=head[u];
head[u]=k++;
}
int v;
int dfs(int tem,int t)
{
if(head[t]==-1) return 0;
if(vis[tem][t]) return dp[tem][t];
vis[tem][t]=1;
dp[tem][t]=0;
for(int i=head[t];i!=-1;i=e[i].next)
{
int v=e[i].v;
int tmp=0x3f3f3f3f;
if(tem) tmp=min(tmp,dfs(0,v));
tmp=min(tmp,dfs(1,v)+1);
dp[tem][t]+=tmp;
}
return dp[tem][t];
}

int main()
{
while(scanf("%d",&n)==1)
{
memset(in,0,sizeof(in));
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
for(int i=1;i<=n;i++)
{
int x,q,y;
scanf("%d:(%d)",&x,&q);
while(q--)
{
scanf("%d",&y);
adde(x,y);
in[y]++;
}
}
int f;
for(int i=0;i<n;i++) if(!in[i]) f=i;
printf("%d\n",min(dfs(0,f),dfs(1,f)+1));
}
return 0;
}</span>
厂长是大神。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息