题目链接:点击打开链接
题目大意:略。
解题思路:其从根节点开始(包括根节点)到叶子节点的 path_weight 总和等于 K 的该 path 上的 weight 字母序降序输出。
AC 代码
using namespace std;
typedef long long ll;
const int N=109;
struct node
{
int id,val;
}nds[N];
struct sort_vec
{
vector<int> rsv;
}sv[N];
vector<node> v[N];
int n,k,len;
int a[N];
void dfs(int rt, int sum, int l)
{
if(sum==k && v[rt].size()==0)
{
for(int i=0;i<l;i++) sv[len].rsv.push_back(a[i]);
len++;
return;
}
for(int i=0;i<v[rt].size();i++)
{
int w=v[rt][i].val;
if(sum+w>k) continue;
a[l]=w;
dfs(v[rt][i].id,sum+w,l+1);
}
}
int cmp(sort_vec sv1,sort_vec sv2)
{
return sv1.rsv>sv2.rsv;
}
int main()
{
int m,cnt,id,cid,rt=0;
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<n;i++) scanf("%d",&nds[i].val);
for(int i=0;i<m;i++)
{
scanf("%d%d",&id,&cnt);
while(cnt--)
{
scanf("%d",&cid);
nds[cid].id=cid;
v[id].push_back(nds[cid]);
}
}
a[0]=nds[rt].val;
dfs(rt,a[0],1);
sort(sv,sv+len,cmp);
for(int i=0;i<len;i++)
for(int j=0;j<sv[i].rsv.size();j++)
printf("%d%c",sv[i].rsv[j],j==sv[i].rsv.size()-1?'\n':' ');
return 0;
}