1053. Path of Equal Weight (30)

来源:互联网 发布:mac有必要贴膜吗 编辑:程序博客网 时间:2024/05/24 03:20

1.该题使用树节点数据结构,其中包含vector<int> child列表和权重值

2.使用DFS进行遍历搜索(节点最多100个),能够满足要求



AC代码:

//#include<string>//#include<stack>//#include<unordered_set>//#include <sstream>//#include "func.h"//#include <list>#include <iomanip>#include<unordered_map>#include<set>#include<queue>#include<map>#include<vector>#include <algorithm>#include<stdio.h>#include<iostream>#include<string>#include<memory.h>#include<limits.h>#include<stack>using namespace std;struct TreeNode{vector<int> child;int w;TreeNode() :child(0), w(0){};};void dfs(int now, int target, vector<TreeNode>&tree, vector<int>&path, vector<vector<int>>&ans){if (tree[now].child.size() == 0 && target == 0)ans.push_back(path);//叶子节点,并且满足要求if (tree[now].child.size() != 0 && target <= 0)return;//else if (target < 0)return;for (int i = 0; i < tree[now].child.size(); i++){path.push_back(tree[tree[now].child[i]].w);dfs(tree[now].child[i], target - tree[tree[now].child[i]].w, tree, path, ans);path.pop_back();}}bool cmp(const vector<int>&a, const vector<int>&b){for (int i = 0; i < min(a.size(), b.size()); i++){if (a[i] >b[i])return true;else if (a[i] < b[i])return false;}return false;}int main(void){int nodeSum, nonLeafSum, target;cin >> nodeSum >> nonLeafSum >> target;vector<TreeNode> tree(nodeSum);for (int i = 0; i < nodeSum; i++){scanf("%d", &tree[i].w);}for (int i = 0; i < nonLeafSum; i++){int nodeNum=0;scanf("%d", &nodeNum);int childSum = 0;scanf("%d", &childSum);tree[nodeNum].child = vector<int>(childSum);for (int j = 0; j < childSum; j++){scanf("%d", &tree[nodeNum].child[j]);}}if (nodeSum > 0){vector<int> path;vector<vector<int>> ans;path.push_back(tree[0].w);//注意判断根节点是否存在target -= tree[0].w;dfs(0, target, tree, path, ans);sort(ans.begin(), ans.end(), cmp);for (int i = 0; i < ans.size(); i++){for (int j = 0; j < ans[i].size(); j++){printf("%d", ans[i][j]);if (j != ans[i].size() - 1)printf(" ");}printf("\n");}}return 0;}


0 0
原创粉丝点击