题目:
根据节点的值,从大到小输出值为S的所有路径。
思路:这题主要是如何保存路径麻烦。节点从大到小在输入的时候就能够处理。然后每个节点用一个vector保存路径。
#include<iostream>
#include<vector>
#include<algorithm>
#include<stdio.h>
using namespace std;
struct node
{
int all,value;
vector<int>child;//存放子节点的下标
vector<int>path;
};
node lists[200];
bool cmp(int x,int y)
{
return lists[x].value>lists[y].value;
}
void dfs(int index,int S)
{
if(lists[index].all>S)
return;
if(lists[index].all==S)
{
if(lists[index].child.size()!=0)
return;
int num=lists[index].path.size();
for(int i=0;i<num;i++)
{
int j=lists[index].path[i];
if(i==num-1)
printf("%d\n",lists[j].value);
else
printf("%d ",lists[j].value);
}
}
//当前all<S
int numchild=lists[index].child.size();
for(int i=0;i<numchild;i++)
{
int x=lists[index].child[i];
lists[x].all=lists[index].all+lists[x].value;
lists[x].path.clear();
lists[x].path=lists[index].path;
lists[x].path.push_back(x);
dfs(x,S);
}
return;
}
int main()
{
int N,M,S;
cin>>N>>M>>S;
for(int i=0;i<N;i++)
{
cin>>lists[i].value;
}
for(int i=0;i<M;i++)
{
int x,num,y;
cin>>x>>num;
for(int j=0;j<num;j++)
{
cin>>y;
lists[x].child.push_back(y);
}
sort(lists[x].child.begin(),lists[x].child.end(),cmp);
}
//初始化根节点
lists[0].all=lists[0].value;
lists[0].path.push_back(0);
dfs(0,S);
return 0;
}