1053 Path of Equal Weight (30 分)

版权声明:本文为博主原创文章,欢迎交流学习,未经博主允许不得转载。 https://blog.csdn.net/qq_43749739/article/details/89856844

注:备战2020ing…暂时没时间注解啦,大家凑合先看下代码叭,肥宅对不住了。

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
vector< vector<int> > Ans;
vector<int > path;
typedef struct
{
    int w;
    vector<int> child;
}node;
int cmp( vector<int > a, vector<int > b )
{
    for( auto i = a.begin(), j = b.begin(); i != a.end() && j != b.end(); ++i, ++j )
        if( *i != *j )
            return *i > *j;
    return a.size() - b.size();
}
void DFS( node T[], int i, int K, int sumW )
{
    if( T[i].w + sumW <= K )
    {
        path.push_back(T[i].w);
        sumW += T[i].w;
        if( !T[i].child.size() && sumW == K )
            Ans.push_back(path);
        for(int j = 0; j < T[i].child.size(); ++j)
            DFS( T, T[i].child[j], K, sumW );
        path.pop_back();
    }
}
int main()
{
    int N, M, K, R, nC, C, sumW = 0, index;
    scanf("%d %d %d", &N, &M, &K);
    node T[N];
    for(int i = 0; i < N; ++i)
        scanf("%d", &T[i].w);
    for(int i = 0; i < M; ++i)
    {
        scanf("%d %d", &R, &nC);
        for(int j = 0; j < nC; ++j)
        {
            scanf("%d", &C);
            T[R].child.push_back(C);
        }
    }
    DFS( T, 0, K, 0 );
    sort( Ans.begin(), Ans.end(), cmp );
    for(int i = 0; i != Ans.size(); ++i)
        for(auto j = Ans[i].begin(); j != Ans[i].end(); ++j)
            printf("%d%s", *j, j + 1 == Ans[i].end() ? "\n":" ");
}

猜你喜欢

转载自blog.csdn.net/qq_43749739/article/details/89856844