带权树的路径问题,这题我一开始用的是BFS方法,之后发现可以求出路径数组,但在对数组从大到小排序的过程中遇到了无法解决的问题。理解题意后发现这题用DFS方法更为简便
坑点如下
1,熟悉DFS的模板,注意递归边界。
2,若采用DFS方法,要使得路径从大到小依次输入,只需对每一个非叶子结点,将其子节点按权从大到小排列即可
bool cmp(int a,int b){
return node[a].weight>node[b].weight;
}
3,本题我采用vector容器path记录当前节点所走过的路径。
4,留下疑问,如何对vector容器中的数组按照从大到小的顺序按行排列。(BFS方法要解决的问题)
整体代码如下
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=110;
int n,m;
long long s;
int pnum=0;
struct Node{
int weight;
vector<int>child;
vector<int>path,temp;
}node[maxn];
bool cmp(int a,int b){
return node[a].weight>node[b].weight;
}
void DFS(int index,int sum){
if(sum==s&&node[index].child.size()==0){
for(int i=0;i<node[index].path.size();i++){
printf("%d",node[index].path[i]);
if(i!=node[index].path.size()-1){printf(" ");}
}
printf("\n");
return ;
}
if(sum>s){return;}
if(sum<s&&node[index].child.size()==0){return;}
for(int i=0;i<node[index].child.size();i++)
{ node[node[index].child[i]].path=node[index].path;
node[node[index].child[i]].path.push_back(node[node[index].child[i]].weight);
DFS(node[index].child[i],sum+node[node[index].child[i]].weight);
}
}
int main(){
scanf("%d%d%lld",&n,&m,&s);
for(int i=0;i<n;i++){
scanf("%d",&node[i].weight);
}
int id,cnum,child;
for(int i=0;i<m;i++){
scanf("%d%d",&id,&cnum);
for(int l=0;l<cnum;l++){
scanf("%d",&child);
node[id].child.push_back(child);
}
sort(node[id].child.begin(),node[id].child.end(),cmp);
}
node[0].path.push_back(node[0].weight);
DFS(0,node[0].weight);
}