clipboard.png
也不难,使用DFS就能很好的解决问题;
对于DFS的途中节点记录有两种方法,这个需要注意一下:
1.使用vector模拟栈,每次递归的时候压栈或者弹栈,遇到符合要求的时候直接复制该栈保存;
2.使用path数组,并且利用numnode来追踪path数组的长度,其中path[i]代表路径上第i个节点的编号。由于numnode限制了path的长度,所以无需弹栈或者入站操作,只需要覆盖即可;

关于本题判断还有一个优化,就是在过程中每次sum>s直接弹出,比之前自己想判断叶子节点优化了不少;
完整代码如下所示:

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
using std::vector;
const int maxn=110;
int n,m,s;
int path[maxn];
struct node{
    int weight;
    vector<int>child;
}table[maxn];

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

void DFS(int index,int numNode,int sum){
    if(sum>s)
        return;
    if(sum==s){
        if(table[index].child.size()!=0)
            return;
        for(int i=0;i<numNode;i++){
            printf("%d",table[path[i]].weight);
            if(i<numNode-1)
                printf(" ");
            else
                printf("\n");
        }
        return;
    }
    for(int i=0;i<table[index].child.size();i++){
        path[numNode]=table[index].child[i];
        DFS(table[index].child[i],numNode+1,sum+table[table[index].child[i]].weight);
    }
}

int main(){
    int root,leaf,num;
    scanf("%d%d%d",&n,&m,&s);
    for(int i=0;i<n;i++){
        scanf("%d",&table[i].weight);
    }
    for(int i=0;i<m;i++){
        scanf("%d%d",&root,&num);
        for(int j=0;j<num;j++){
            scanf("%d",&leaf);
            table[root].child.push_back(leaf);
        }
        sort(table[root].child.begin(),table[root].child.end(),cmp);
    }
    path[0]=0;
    DFS(0,1,table[0].weight);
    system("pause");
    return 0;
}

宋霖轩
16 声望4 粉丝

克哈的霓虹都为我闪烁


« 上一篇
PAT A1004
下一篇 »
PAT A1107