题目链接;http://codeforces.com/contest/1099/problem/D

题目大意:给出一棵树,每个节点到根节点的路径上经过的所有点的权值之和,其深度为偶数的节点的信息全部擦除了,也就是用-1表示,让你求最终所有点权之和(要求最小)

具体思路:对于每一个节点,这个点到根节点的权值最小的时候是他的所有的根节点的最小值,然后一路更新上去就可以了,最后求值得时候,我们求父亲节点和子节点之间的差就可以了, 如果差值为负值就是非法情况。

AC代码:

 #include<bits/stdc++.h>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = 1e5+;
const int mod = 1e9+;
int head[maxn],num,dp[maxn][],flag=,vis[maxn];
struct node
{
int nex;
int to;
} edge[maxn*];
ll sum;
void addedge(int fr,int to)
{
edge[num].to=to;
edge[num].nex=head[fr];
head[fr]=num++;
}
void dfs1(int fr,int rt)
{
if(dp[fr][]==-)
{
int minn=inf;
for(int i=head[fr]; i!=-; i=edge[i].nex)
{
int to=edge[i].to;
if(to==rt)
continue;
minn=min(minn,dp[to][]);
}
dp[fr][]=minn;
//cout<<fr<<" "<<dp[fr][0]<<endl;
}
for(int i=head[fr]; i!=-; i=edge[i].nex)
{
int to=edge[i].to;
if(to==rt)
continue;
dfs1(to,fr);
if(dp[to][]==inf)
dp[to][]=dp[fr][];
}
}
void dfs2(int fr,int rt)
{
if(flag==)
return ;
for(int i=head[fr]; i!=-; i=edge[i].nex)
{
int to=edge[i].to;
if(to==rt)
continue;
dfs2(to,fr);
sum+=(dp[to][]-dp[fr][]);
if(dp[to][]-dp[fr][]<)
{
flag=;
} }
} int main()
{
int n;
scanf("%d",&n);
for(int i=; i<=n; i++)
{
head[i]=-;
}
int tmp;
for(int i=; i<=n; i++)
{
scanf("%d",&tmp);
addedge(tmp,i);
addedge(i,tmp);
}
for(int i=; i<=n; i++)
{
scanf("%d",&dp[i][]);
}
dfs1(,-);
dfs2(,-);
sum+=dp[][];
for(int i=; i<=n; i++)
{
// cout<<dp[i][0]<<endl;
}
// for(int i=n-1; i>=1; i--)
// {
// sum+=(dp[i+1][0]-dp[i][0]);
// if(dp[i+1][0]-dp[i][0]<0)flag=0;
// }
if(flag==)
sum=-;
printf("%lld\n",sum);
return ;
}
/*
5
1 2 2 3
1 -1 2 3 -1
3
*/

最新文章

  1. Yii2 数据查询
  2. REOBJECT 结构
  3. php以post方式向接口发送数据
  4. *.location.href 用法:
  5. Unexpected error: UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte 0xd2 in position 69: ordinal not in range(128)-解决办法
  6. 即时定位与地图构建SLAM(Simultaneous Localization and Mapping)
  7. [Everyday Mathematics]20150223
  8. HDU 4587 TWO NODES 割点
  9. 【转】【cocos2d-x教程】如何使用WebSocket
  10. [Irving]SqlServer 拆分函数用法
  11. iOS开发经验总结(上)
  12. svn之——linux下清除svn的用户名和密码
  13. Visual Studio 2017 Key 激活码
  14. Linux中常用来查看进程的命令PS
  15. Eclipse中SVN插件的安装和配置(在线安装)
  16. python使用细节
  17. HDU 4352 XHXJ&#39;s LIS 数位dp lis
  18. Linux命令(二十三) 磁盘管理命令(一) df,du,tune2fs
  19. ajax请求格式
  20. 怎样自己定义注解Annotation,并利用反射进行解析

热门文章

  1. Java中LinkedList的fori和foreach效率比较
  2. 一些基于jQuery开发的控件
  3. HDU 6184 Counting Stars
  4. BZOJ 4421: [Cerc2015] Digit Division
  5. Linux系统中/opt 和 /usr目录
  6. 【洛谷P4706】取石子
  7. 【BZOJ4903/UOJ300】【CTSC2017】吉夫特
  8. 【bzoj2555】 SubString
  9. 【bzoj3238】 Ahoi2013—差异
  10. MVP, MVVM In Android