题意:在一棵树中找到与给定权值和相同的路径,排序输出路径权值。
一开始的想法是,先dfs,求出叶子节点到根节点的权值和,在这一过程中将符合要求的叶子节点存起来,由于认为树中节点只有一个父节点所以知道叶子节点后路径应该是唯一的,所以用一个数组存下每个节点的父节点,然后就可以由叶子节点找寻路径,但提交后发现有俩个测试点过不了。(望指正)
参考别人的代码后,用另一种方法,在dfs时将每条路经存起来,然后将符合要求的路径存进结果数组,再排序输出,竟然过了!!
本题的难点认为是最后的二维数组排序,具体见代码
原先代码:
#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
using namespace std;
vector<vector<int> >tree;
vector<int>weight;
vector<int>wei;
vector<int>path;
vector<int>res;
vector<vector<int> >p;
void dfs(int rt,int s)
{
int i;
if(tree[rt].size()==0)
{
if(wei[rt]==s)
{
res.push_back(rt);
}
return;
}
for(i=0;i<tree[rt].size();i++)
{
wei[tree[rt][i]]=wei[rt]+weight[tree[rt][i]];
dfs(tree[rt][i],s);
}
}
void getpath(int r,int rt,int c)
{
// cout<<rt<<" "<<r<<" "<<c<<endl;
if(r==rt)
{
p[c].push_back(weight[r]);
return;
}
if(r!=rt)
{
p[c].push_back(weight[r]);
r=path[r];
getpath(r,rt,c);
// p[c].push_back(weight[r]);
}
}
bool cmp(vector<int> a,vector<int> b)
{
int i;
for(i=0;i<a.size()&&i<b.size();i++)
{
if(a[i]==b[i])
continue;
if(a[i]>b[i])
return true;
if(a[i]<b[i])
return false;
}
return false;
}
int main(){
int n,m,s;
int cnt;
cin>>n>>m>>s;
tree.resize(n);
wei.resize(n);
path.resize(n);
p.resize(n);
int i,w,j;
for(i=0;i<n;i++)
{
cin>>w;
weight.push_back(w);
}
int id,idl,ln;
for(i=0;i<m;i++)
{
cin>>id>>ln;
for(j=0;j<ln;j++)
{
cin>>idl;
tree[id].push_back(idl);
path[idl]=id;
}
}
wei[0]=weight[0];
dfs(0,s);
for(i=0;i<res.size();i++)
{
getpath(res[i],0,cnt);
cnt++;
}
sort(p.begin(),p.begin()+cnt,cmp);
for(i=0;i<cnt;i++)
{
reverse(p[i].begin(),p[i].end());
for(j=0;j<p[i].size();j++)
j==p[i].size()-1?cout<<p[i][j]:cout<<p[i][j]<<" ";
cout<<endl;
}
}
ac代码:
#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
using namespace std;
vector<vector<int> >tree;
vector<int>weight;
vector<int>wei;
vector<int>path;
vector<int>res;
vector<vector<int> >p;
void dfs(int rt,int s,vector<int> pa)
{
int i;
if(tree[rt].size()==0)
{
if(wei[rt]==s)
{
p.push_back(pa);
}
return;
}
for(i=0;i<tree[rt].size();i++)
{
vector<int>tmp;//注意这里要建一个临时数组,每次递归的路径不一样
tmp=pa;
tmp.push_back(weight[tree[rt][i]]);
wei[tree[rt][i]]=wei[rt]+weight[tree[rt][i]];
dfs(tree[rt][i],s,tmp);
}
}
int cnt;
bool cmp(vector<int> a,vector<int> b)
{
int i;
for(i=0;i<a.size()&&i<b.size();i++)
{
if(a[i]==b[i])
continue;
if(a[i]>b[i])
return true;
if(a[i]<b[i])
return false;
}
return false;
}
int main(){
freopen("path.in.txt","r",stdin);
int n,m,s;
cin>>n>>m>>s;
tree.resize(n);
wei.resize(n);
path.resize(n);
// p.resize(n);
int i,w,j;
for(i=0;i<n;i++)
{
cin>>w;
weight.push_back(w);
}
int id,idl,ln;
for(i=0;i<m;i++)
{
cin>>id>>ln;
for(j=0;j<ln;j++)
{
cin>>idl;
tree[id].push_back(idl);
path[idl]=id;
}
}
wei[0]=weight[0];
vector<int>pa;
pa.push_back(weight[0]);
dfs(0,s,pa);
sort(p.begin(),p.end(),cmp);
for(i=0;i<p.size();i++)
{
for(j=0;j<p[i].size();j++)
j==p[i].size()-1?cout<<p[i][j]:cout<<p[i][j]<<" ";
cout<<endl;
}
}