トピック:https://pintia.cn/problem-sets/994805342720868352/problems/994805424153280512
同重量の1053パス(30分)
ルートと非空の木を考えるとR私は**、および重量で* W **私は*各ツリーノード* Tに割り当てられています。* Rからのパスの重量* Lへ*はから経路に沿った全てのノードの重みの合計であると定義される任意のリーフノードにR * L。
今、あなたがその重みを持つすべてのパスが与えられた数に等しい見つけることになっている、任意の重み付きツリーを与えられました。たとえば、のは、以下の図に示されたツリーを考える:各ノードに対して、上位数は、2桁の数字であるノードIDであり、下の数字は、そのノードの重さです。、{10 5 2 7}、{10 4 10}、{10 3 3 6 2}と{10 3 3 6 2}:同じ所定の重量を有する4つの異なる経路が存在し、指定された番号が24であると仮定するこれは、図中の赤色エッジに対応します。
入力仕様:
各入力ファイルには、1つのテストケースが含まれています。0 <含む行を有する各ケース開始N ≤100、ツリー内のノードの数を、M(< N)、非リーフノードの数、0 < S <230、所定の重量番号。次の行は含まN iが**ツリーノード* T *にW ** I *(<1000)対応する正の数を。そして、 M *のラインは、フォーマットのそれぞれは、次のとおりです。
ID K ID[1] ID[2] ... ID[K]
ここで、ID
所定の非リーフノードを表す2桁の数字であり、K
2桁のシーケンスに続いて、その子の数でID
のその子の。簡略化のために、私たちがするルートIDを修正してみましょう00
。
出力仕様:
各テストケースのために、中量Sを有するすべてのパスを印刷する非増加オーダー。各パスは、順番にルートからリーフまでの印刷量を有する行を占有します。すべての数字は行の末尾に余分なスペースをスペースで区切る必要があります。
注:シーケンス{ 1、A 2、⋯、nは}であると言われているよりも大きい {シーケンス B 1、 B 2、⋯、 Bの M 1≤が存在する場合} K < M I nは { N、M }ようにそのA iは= Bは、私のために、私は 1、⋯= K、およびK +1> Bの K +1。
サンプル入力:
20 9 24
10 2 4 3 5 10 2 18 9 7 2 2 1 3 12 1 8 6 2 2
00 4 01 02 03 04
02 1 05
04 2 06 07
03 3 11 12 13
06 1 09
07 2 08 10
16 1 15
13 3 14 16 17
17 2 18 19
サンプル出力:
10 5 2 7
10 4 10
10 3 3 6 2
10 3 3 6 2
分析:(ツリーの先行順走査)DFS
辞書順に右ポイントと出力パスS:タイトルの意味。
- DFS重量を横断経路を計算し、必要性は、各再帰DFSのにパラメータを渡す
weight+Node[index].data
ことができます。
声明を分離しないでくださいweight+=Node[index].data
同じ一時、一時パスが(だけでなく、新しいノードを受信パスがプッシュに影響を与えないことを確実にするためにお互いをポップ)ので、対応する文はweight-=Node[index].data
、書き込みに忘れがちですが、エラーが発生します。
- 最後に、出力パスは、2つの方法がありますが、辞書式順序が必要です。
- 側:変数の設定は
vector<vector<int>> ans
、すべてのパスのANSを添加し、そして最後にソート()は、要素のANSをソートします。 - サイド2:データ入力ツリー構造にソート()で、DFSの前に行われていないパスの始まりは、辞書式順序で配列され、直接出力することができるDFSトラバーサル経路の後に実行されるように調整されます。
- 側:変数の設定は
コード
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int maxN=110;
struct node {
int data=0;
vector<int> child;
} Node[maxN];
int N,M,S;
vector<vector<int>> ans;//路径集合
vector<int> temp;//临时路径
void DFS(int root,int weight) {
if(weight>S) {
return;
}
if(weight==S) {
if(Node[root].child.size()==0) {
ans.push_back(temp);
}
return;
}
for(int i=0; i<Node[root].child.size(); i++) {
int index=Node[root].child[i];
temp.push_back(Node[index].data);
DFS(index,weight+Node[index].data);
temp.pop_back();
}
}
int main() {
scanf("%d%d%d",&N,&M,&S);
for(int i=0; i<N; i++) {
scanf("%d",&Node[i].data);
}
int index,childNum,childNo;
for(int i=0; i<M; i++) {
scanf("%d%d",&index,&childNum);
for(int j=0; j<childNum; j++) {
scanf("%d",&childNo);
Node[index].child.push_back(childNo);
}
}
temp.push_back(Node[0].data);
DFS(0,Node[0].data);
sort(ans.begin(),ans.end(),greater<vector<int>>());//从大到小排序ans
for(int i=0; i<ans.size(); i++) {
for(int j=0; j<ans[i].size(); j++) {
printf("%d",ans[i][j]);
if(j<ans[i].size()-1)
printf(" ");
else
printf("\n");
}
}
return 0;
}
ご注意ください
[エラー]のベースオペランド「 - >」非ポインタ型を持つ「ノード」を
「 - >」フロントのポインタではありません。
オブジェクトは、メンバ変数を呼び出します.
struct node {
int data=0;
vector<int> child;
} Node[maxN];
//Node[root].data
ポインタ参照メンバ変数->
struct node {
int data;
node* lchild;
node* rchild;
}Node;
//Node->rchild
- ()ソートベクトル<ベクトル<int型>>並び替え
- ソート()パラメータ書き込みans.begin()とans.end()。
- 注コンパレータ文言
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> v1= {10,5,2,7};
vector<int> v2= {10,3,3,6,2};
vector<int> v3= {10,3,3,6,2};
vector<int> v4= {10,4,10};
vector<vector<int>> ans;
bool cmp(vector<int> v1,vector<int> v2) {
return v1>v2;
}
//比较器的错误写法
//bool cmp(vector<int> v1,vector<int> v2) {
// if(v1>v2) return v1>v2;
// else return v1<v2;
//}
int main() {
ans.push_back(v1);
ans.push_back(v2);
ans.push_back(v3);
ans.push_back(v4);
// sort(ans[0],ans[0]+2*2,cmp);//错误:取到了一个vector,是对象
sort(ans.begin(),ans.end(),cmp);//取到了一个迭代器//方一
// sort(ans.begin(),ans.end(),greater<vector<int>>());//方二
for(int i=0; i<ans.size(); i++) {
vector<int> temp=ans[i];
for(auto x:temp)
cout<<x<<" ";
cout<<endl;
}
return 0;
}