ITPub博客

首页 > > > 一个小的算法问题。

一个小的算法问题。

作者:hawkliu 时间:2019-09-24 14:46:04 0 删除 编辑

五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序。

已知整个地下超市的所有通道呈一棵树的形状;某些通道之间可以互相望见。总经理要求所有通道的每个端点(树的顶点)都要有人全天候看守,在不同的通道端点安排保安所需的费用不同。

一个保安一旦站在某个通道的其中一个端点,那么他除了能看守住他所站的那个端点,也能看到这个通道的另一个端点,所以一个保安可能同时能看守住多个端点(树的结点),因此没有必要在每个通道的端点都安排保安。

请你帮助超市经理策划安排,在能看守全部通道端点的前提下,使得花费的经费最少。

Input

第1行 n,表示树中结点的数目。

第2行至第n+1行,每行描述每个通道端点的信息,依次为:该结点标号i(0

对于一个n(0 < n <= 1500)个结点的树,结点标号在1到n之间,且标号不重复。

Output

最少的经费。

Sample Input

6

1 30 3 2 3 4

2 16 2 5 6

3 5 0

4 4 0

5 11 0

6 5 0

Sample Output

25

下面是我的代码,不知道为何WA 已经n++次了QAQ。。。就是找不出错误在哪里,。。第一次做树形dp,受打击呀。。。。希望各路前辈或者知道的人帮帮忙。到了这个地步感觉调试只能是浪费时间。。

#include

#include

#include

using namespace std;

const int MAXN = 1510;

int n;

int f[MAXN][2];

int vis[MAXN][MAXN];

int v0[MAXN];

int w[10010],a[10010],temp=0;

void dfs(int u){

v0[u] = true;

for(int i=1; i<=n;i++)

{

if(!vis[u][i])

{continue;}

if(v0[i])

{continue;}

dfs(i);

f[u][0]+=f[i][1];

f[u][1]+=min(f[i][1],f[i][0]);

}

}

int main(){

scanf("%d", &n);

int x,v,u;

memset(vis, 0, sizeof(vis));

memset(v0,0,sizeof(v));

for(int i=1; i<=n; i++){

scanf("%d%d%d", &a[i],&w[i],&x);

while(x--){

scanf("%d", &v);

vis[a[i]][v]=1;vis[v][a[i]]=1;

}

}

for(int i=0; i<=n; i++)

{f[i][1] = w[i]; f[i][0] = 0; }

if(n==1)

{printf("%d\n",w[n]);return 0;}

else dfs(1);

printf("%d\n", min(f[1][0], f[1][1]));

return 0;

}

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/887/viewspace-3167182/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-07-29

  • 博文量
    274
  • 访问量
    1130