PAT甲级1053 Path of Equal Weight (30分) :[C++题解]dfs求树的路径长度、邻接表
生活随笔
收集整理的這篇文章主要介紹了
PAT甲级1053 Path of Equal Weight (30分) :[C++题解]dfs求树的路径长度、邻接表
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 題目分析
- 題目鏈接
題目分析
輸入樣例:
輸出樣例:
10 5 2 7 10 4 10 10 3 3 6 2 10 3 3 6 2題意重述:給定一顆二叉樹和一個路徑長度s,讓遍歷二叉樹,找出所有長度等于s的路徑,并且輸出。
分析:使用鄰接表來存樹。 然后就是dfs來遍歷。
當遇到葉子結(jié)點h[u] == -1的時候,如果長度等于s則保存一條路徑,并且dfs遞歸返回。
另外就是深度優(yōu)先遍歷鄰接表。其中e[i]存的是結(jié)點,不是i。
//暴搜u的所有兒子for(int i=h[u]; i!= -1 ;i=ne[i]){path.push_back(w[e[i]]); //更新路徑dfs(e[i],s+w[e[i]],path); //暴搜下一個點path.pop_back(); //恢復現(xiàn)場}ac代碼
#include<bits/stdc++.h> using namespace std; const int N = 110;int n , m,S; //鄰接表 int h[N],e[N],ne[N],idx;int w[N]; //權(quán)重vector<vector<int>> ans; //記錄路徑// e[i]存的是當前結(jié)點 //ne[i] 存的是單鏈表中下一個結(jié)點“序號” //idx 就是單鏈表中的“序號” void add(int a, int b){e[idx] =b, ne[idx]= h[a],h[a] =idx ++; }/*暴搜所有等于S的路徑u:當前結(jié)點s:權(quán)值path:路徑 */ void dfs(int u,int s , vector<int>& path){//遞歸結(jié)束條件if(h[u] == -1){ // 是葉子結(jié)點if(s == S) {ans.push_back(path);return;}}//暴搜u的所有兒子for(int i=h[u]; i!= -1 ;i=ne[i]){path.push_back(w[e[i]]); //更新路徑dfs(e[i],s+w[e[i]],path); //暴搜下一個點path.pop_back(); //恢復現(xiàn)場}}int main(){memset(h, -1, sizeof h);cin>> n >> m >> S;for(int i = 0; i < n; i++) cin>>w[i];//i號結(jié)點的權(quán)重是w[i]while(m--){int id , n1;cin>> id >> n1;while(n1--){ //id結(jié)點的兒子們int son;cin >> son;add(id ,son);}}//根結(jié)點int root = 0;//初始化路徑為根結(jié)點vector<int> path({w[0]});//暴搜dfs(root,w[0],path);//排序sort(ans.begin(),ans.end(),greater<vector<int>>());//輸出for(auto p :ans){cout<<p[0];for(int i=1;i<p.size();i++) cout<<" "<<p[i];cout<<endl;}}題目鏈接
acwing1539. 等重路徑
PAT甲級1053 Path of Equal Weight (30分)
總結(jié)
以上是生活随笔為你收集整理的PAT甲级1053 Path of Equal Weight (30分) :[C++题解]dfs求树的路径长度、邻接表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT甲级1135 Is It A Re
- 下一篇: s3c2440移植MQTT