【题目链接】:http://codeforces.com/contest/767/problem/C

【题意】



一棵树;

树上的每个节点都有一个权值;

让你把一棵树切掉两条边;

然后把这棵树分成了3个部分;

要求这3个部分,每个部分的权值和相同;

即sum1=sum2=sum3

【题解】



树形DP;

一开始累加所有节点的权值和sum;

如果不是3的倍数则直接输出无解;

用cnt[x]记录x节点下方的子树和(权值和);

假设dfs到了第x个节点

考虑两种情况;



有两个节点y,z;

且sum/3==cnt[y]==cnt[z]

且y和z分别在x的两个儿子节点所在的子树中;

输出y和z就好



2/3*sum==cnt[x];

然后x的子树里面有另外一个节点y

满足1/3*sum==cnt[y];

输出x和z就好

这里注意x不能为根节点!

定义个数组往上传这个子树里面有没有1/3sum和2/3sum就好;



【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define ps push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define ref(x) scanf("%lf",&x) typedef pair<int, int> pii;
typedef pair<LL, LL> pll; const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
const double pi = acos(-1.0);
const int N = 1e6+1000; int n,sum=0,goal;
int fa,w[N],root,cnt[N],haved1[N],haved2[N];
vector <int> G[N]; void dfs(int x)
{
cnt[x] = w[x];
int num = 0,a[5];
for (int y : G[x])
{
dfs(y);
if (haved1[y])
{
haved1[x] = haved1[y];
a[++num] = haved1[y];
if (num > 1)
{
printf("%d %d\n", a[1], a[2]);
exit(0);
}
}
if (haved2[y]) haved2[x] = haved2[y];
cnt[x] += cnt[y];
}
if (cnt[x] == goal) haved1[x] = x;
if (cnt[x] == 2 * goal) haved2[x] = x;
if (x!=root && 2*goal==cnt[x])
{
for (int y : G[x])
{
if (haved1[y])
{
printf("%d %d\n", haved1[y], x);
exit(0);
}
}
}
} int main()
{
//freopen("F:\\rush.txt", "r", stdin);
rei(n);
rep1(i, 1, n)
{
rei(fa), rei(w[i]);
if (fa == 0)
root = i;
G[fa].ps(i);
sum += w[i];
}
if (sum % 3) return puts("-1"), 0;
goal = sum / 3;
dfs(root);
puts("-1");
//printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
return 0;
}

最新文章

  1. Lambda 表达式[MSDN]
  2. 携程Ctrip DAL的学习 2
  3. C# 解析 Json
  4. Bootflat – 基于 Bootstrap CSS 框架的扁平化界面
  5. CentOS安装JAVA后JAVA版本不对的问题
  6. iptables常用操作
  7. bat 脚本传递参数测试
  8. 关于JS加载的问题
  9. 利用ExpandableListView和gridview 显示可展开折叠菜单导航
  10. php100 编程小技巧
  11. C图书借还示例
  12. MySql按指定天数进行分组数据统计分析 1
  13. ng-Directive
  14. AUTO_INCREMENT列在InnoDB里如何工作
  15. java 网络编程Socket编程
  16. Ultimus BPM 零售和快消品行业应用解决方案
  17. iphone 4s页面引用jssdk无效
  18. Redhat Linux 自动修改密码
  19. boost::assign(标准容器填充库)
  20. java 关于性别的处理

热门文章

  1. [JSOI 2010] 满汉全席
  2. bzoj1008 [HNOI2008]越狱——快速幂
  3. django - request.POST和request.body获取值时出现的情况
  4. sort与sorted的区别
  5. PCB genesis短槽加引导孔实现方法
  6. E20170926-mk
  7. 9.10NOIP模拟题
  8. codevs3342绿色通道(单调队列优化dp)
  9. Java中JPS命令监控
  10. 关于C++ const 变量