java编写的atm机项目结题报告_结题报告 - eason66 - 博客园

输出路径节点总和为S的路径数量。

思路

先准备数据结构:(描述思路时会用到,先给出定义和使用)

1.vector tree[100000],邻接表(把树看成DAG图)

2.int a[100000]={0},前缀和数组

3.bool color[100001]={false},dfs时使用,true代表访问过,false代表没访问过

4.int weight[100000],存储权值(邻接表不存权值)

5.set r,找根节点(r内的为可能是根节点的元素)

先读入n,s;再读入权值,并将i存入邻接表,权值存入weight。

接着读入x、y,将y插在tree[i]的后面并从集合r中删除y(y有双亲结点(父节点),不可能是根)

最后r中剩下的就是根,存起来(我的root变量),前缀和数组a[0]清零,接着进入dfs:(用递归)

将color[当前访问顶点编号(我的now变量)]置成true,表示已访问,接着计算该节点的前缀和*,然后找结点继续dfs,当结点访问完毕后,用二分搜索找前缀和数组中是否有a[现深度(deep)]-s(在dfs函数里设个变量名打成p了,不过没有关系),若有路径数量++。

*:见附录1

犯的错误

1.二分查找找的是a[deep]-s而不是s。

2.应该用递归实现dfs,而不是用栈,应为用递归比较熟练,不容易错。

3.树根不一定是零,需要找树根。

4.应该用weight数组存权值而不是tree[XX][0]。

收获

1.要注意前缀和:a[i]+a[i+1]+···+a[j]=(a[1]+a[2]+···+a[i-1])-(a[1]+a[2]+a[3]+a[4]+···+a[j])

2.在条件允许的情况下,要用自己熟练的方法解体。

3.不要想当然,不要有侥幸心理。

4.在n<=100000的情况下,不要怕多开几个数组。

附录一

这里用的前缀和是一条从根节点出发的路径上的前缀和

c85c3a07f2736364072d991edf38e216.png

如上图,它原来的路径是12--11--7--6--3,现在变成了12--11--7--6--5,所以数组变成了12、23、30、36、41。

a47f5355409a6c83b53e1245c1839c2b.png

现在路径变成了12--11--7--8,数组变成了12、23、30、38、41。

由于数组是有序的,所以查找有没有路经总和为S是要用二分查找优化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值