前言:
21考研,正在啃《算法笔记》,不论能否进复试记录一下准备路上写下的垃圾代码。
#include<stdio.h>
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<stack>
#include<queue>
using namespace std;
struct node {
int weight;
vector<int> child;
};
const int maxn = 110;
bool isroot[maxn] = { false };
node seq[maxn];
vector<int> tempway;
vector<vector<int> >finalway;
int findroot(int n) {
for (int i = 0; i < n; i++) {
int k = seq[i].child.size();
for (int j = 0; j < k; j++)
isroot[seq[i].child[j]] = true;
}
for (int i = 0; i < n; i++)
if (isroot[i] == false)
return i;
}
bool cmp(vector<int> v1, vector<int>v2) {
for (int i = 0; i < min(v1.size(), v2.size()); i++)
if (v1[i] != v2[i])
return v1[i] > v2[i];
}
void DFS(int root, int sum, int s) {
tempway.push_back(seq[root].weight);
if (sum > s) {
tempway.pop_back();
return;
}
else if (seq[root].child.size() == 0) {
if (sum == s)
finalway.push_back(tempway);
tempway.pop_back();
}
else {
for (int i = 0; i < seq[root].child.size(); i++)
DFS(seq[root].child[i], sum + seq[seq[root].child[i]].weight, s);
tempway.pop_back();
}
}
int main()
{
int n, m, cur, count, temp, s;
cin >> n >> m >> s;
for (int i = 0; i < n; i++)
scanf("%d", &seq[i].weight);
for (int i = 0; i < m; i++) {
scanf("%d%d", &cur, &count);
for (int j = 0; j < count; j++) {
scanf("%d", &temp);
seq[cur].child.push_back(temp);
}
}
int root = findroot(n);
int sum = seq[root].weight;
DFS(root, sum, s);
sort(finalway.begin(), finalway.end(), cmp);
for (int i = 0; i < finalway.size(); i++)
for (int j = 0; j < finalway[i].size(); j++)
if (j != finalway[i].size() - 1)
cout << finalway[i][j] << ' ';
else
cout << finalway[i][j] << endl;
return 0;
}