//
// main.cpp
// PAT_1053. Path of Equal Weight
//
// Created by wjq on 17/5/14.
// Copyright © 2017年 wjq. All rights reserved.
//
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N,M,S,father,numofkids;
struct node
{
vector<int> next;
int weight;
}n[105];
int nextWeight[105];
int sumofweight=0;
void dfs(int now,int sum)
{
if(n[now].next.empty()==true) //必须到叶节点才会检查sum是否等于S.
{
sum+=n[now].weight;
nextWeight[sumofweight++]=n[now].weight;
if(sum==S)
{
for(int i=0;i<sumofweight;i++)
{
if(i!=sumofweight-1)
cout<<nextWeight[i]<<" ";
else
cout<<nextWeight[i]<<endl;
}
}
nextWeight[sumofweight--]=0;
return;
}
for(int i=0;i<n[now].next.size();i++)
{
nextWeight[sumofweight++]=n[now].weight;
dfs(n[now].next[i],sum+n[now].weight);
nextWeight[sumofweight--]=0;
}
}
int cmp(int a,int b)
{
return n[a].weight>n[b].weight;
}
int main(int argc, const char * argv[])
{
cin>>N>>M>>S;
for(int i=0;i<N;i++)
cin>>n[i].weight;
for(int i=0;i<M;i++)
{
cin>>father>>numofkids;
int kid[105];
for(int j=0;j<numofkids;j++)
cin>>kid[j];
sort(kid,kid+numofkids,cmp); //从大到小排.
for(int j=0;j<numofkids;j++)
{
n[father].next.push_back(kid[j]);
}
}
dfs(0,0);
return 0;
}
终于感觉到自己的进步了,很快就把dfs写好了,没有参照网上的代码.一次就过了!
题意:
就是说给你一棵树,树上每个节点有编号和权重两个属性.然后给你一个权值S,让你输出从根节点到叶节点的权重和=S的那些节点的权重.当然结果不止一个,输出顺序按照题意的描述.
思路:建树,dfs,在dfs过程中计算权值,每当到达子节点并且权值和=S的时候输出该路径的所有节点的权重.
考虑到题目中的输出顺序,我们在建树的时候就把权重大的结点放在左边.这样dfs的时候就能先访问到权重相对较大的节点.