0
点赞
收藏
分享

微信扫一扫

PAT (Advanced Level) Practice - 1053 Path of Equal Weight(30 分)


题目链接:​​点击打开链接​​

题目大意:略。

解题思路:其从根节点开始(包括根节点)到叶子节点的 path_weight 总和等于 K 的该 path 上的 weight 字母序降序输出。

AC 代码

#include<bits/stdc++.h>
#include<cmath>

#define mem(a,b) memset(a,b,sizeof a)
#define ssclr(ss) ss.clear(), ss.str("")
#define INF 0x3f3f3f3f
#define MOD 1000000007

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;
}


举报

相关推荐

0 条评论