1053. Path of Equal Weight (30)

1. 原题: https://www.patest.cn/contests/pat-a-practise/1053

2. 思路:

题意:
遍历出从根到叶子路径的总权值与给定的相等的序列。
思路:
核心是dfs了。
然后一个问题是序列从大到小输出?
怎么做呢。假设我们每次都从最大的孩子递归遍历,
那么结果正是我们要的。
所以,我们对每个父结点的孩子降序排序后,再dfs就好了。
已AC

3. 源码(已AC):

#include<iostream>
#include<algorithm>//使用sort函数
#include<vector>
using namespace std;

vector<int> pwt;//存储路径的每个结点权值
vector<int> nwt;//存储树的每个结点权值
int N, M, S;//分别为总结点数, 非叶子节点数,给出的权值
struct Node
{
	bool operator<(const Node &b) const//重载比较运算符
	{
		return wgt > b.wgt;
	}
	int id;//结点编号
	int wgt;//权值
};
vector< vector<Node> > vtree;//类似图的邻接表表示,嵌套vector,表示结点的孩子

void dfs(int s, int sum);//dfs,参数为遍历起点,累计的权值

int main(void)
{
	//freopen("in.txt", "r", stdin);
	cin >> N >> M >> S;
	nwt.resize(N);//重新定义数组大小
	vtree.resize(N);

	for (int i = 0; i < N; i++)//保存每个结点权值
		cin >> nwt[i];
	for (int i = 0; i < M; i++ )
	{
		int par, num;
		cin >> par >> num;
		vtree[par].resize(num);

		for (int j = 0; j < num; j++)//每个孩子结点压入父结点的数组中
		{
			Node tem;
			cin >> tem.id;
			tem.wgt = nwt[tem.id];
			vtree[par][j] = tem;
		}
		sort(vtree[par].begin(), vtree[par].end());//降序排序
	}
	
	dfs(0, 0);

	return 0;
}

void dfs(int s, int sum)
{
	sum += nwt[s];
	pwt.push_back(nwt[s]);

	if (sum > S)//大于直接返回上一级
		return;
	if (sum == S && vtree[s].empty())//相等且为叶子结点,为所求,输出结果
	{
		for (int i = 0; i < pwt.size(); i++)
		{
			if (i == 0)
				cout << pwt[i];
			else
				cout << ' ' << pwt[i];
		}
		cout << endl;
		return;
	}

	if (sum < S && vtree[s].size() > 0)//小于的话,继续dfs
	{
		for (int i = 0; i < vtree[s].size(); i++)
		{
			dfs(vtree[s][i].id, sum);
			pwt.pop_back();//从dfs里返回后要弹出最后压入的
		}
	}

	return;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值