1053 Path of Equal Weight (30 分)

带权树的路径问题,这题我一开始用的是BFS方法,之后发现可以求出路径数组,但在对数组从大到小排序的过程中遇到了无法解决的问题。理解题意后发现这题用DFS方法更为简便
坑点如下
1,熟悉DFS的模板,注意递归边界。
2,若采用DFS方法,要使得路径从大到小依次输入,只需对每一个非叶子结点,将其子节点按权从大到小排列即可

bool cmp(int a,int b){
   return  node[a].weight>node[b].weight;
}

3,本题我采用vector容器path记录当前节点所走过的路径。
4,留下疑问,如何对vector容器中的数组按照从大到小的顺序按行排列。(BFS方法要解决的问题)
整体代码如下

#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=110;
int n,m;
long long s;
int pnum=0;
struct Node{
    int weight;
    vector<int>child;
    vector<int>path,temp;
}node[maxn];
bool cmp(int a,int b){
   return  node[a].weight>node[b].weight;
}
void DFS(int index,int sum){
    if(sum==s&&node[index].child.size()==0){
        for(int i=0;i<node[index].path.size();i++){
            printf("%d",node[index].path[i]);
            if(i!=node[index].path.size()-1){printf(" ");}
        }
        printf("\n");
        return ;
    }
    if(sum>s){return;}
    if(sum<s&&node[index].child.size()==0){return;}
    for(int i=0;i<node[index].child.size();i++)
    {   node[node[index].child[i]].path=node[index].path;
        node[node[index].child[i]].path.push_back(node[node[index].child[i]].weight);
        DFS(node[index].child[i],sum+node[node[index].child[i]].weight);
    }
}
int main(){
    scanf("%d%d%lld",&n,&m,&s);
    for(int i=0;i<n;i++){
        scanf("%d",&node[i].weight);
    }
    int id,cnum,child;
    for(int i=0;i<m;i++){
        scanf("%d%d",&id,&cnum);
        for(int l=0;l<cnum;l++){
            scanf("%d",&child);
            node[id].child.push_back(child);
        }  
        sort(node[id].child.begin(),node[id].child.end(),cmp);
    }
    node[0].path.push_back(node[0].weight);
    DFS(0,node[0].weight);
}
上一篇:Wooden Sticks


下一篇:数据结构与算法---23.prim普利姆算法、kruskal克鲁斯卡尔算法