题目描述
这里我们来考察某一位祖师爷门下的徒子徒孙家谱:假设家谱中的每个人只有1位师傅(除了祖师爷没有师傅);每位师傅可以带很多徒弟;并且假设辈分严格有序,即祖师爷这门武功的每个第i代传人只能在第i-1代传人中拜1个师傅。
我们假设已知祖师爷的功力值为Z,每向下传承一代,就会减弱r%,除非某一代弟子得道。现给出师门谱系关系,要求你算出所有得道者的功力总值。
C++(bfs)
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, double> PID;
const int N = 1e5 + 10, M = 2 * N;
int h[N], e[M], ne[M], idx;
bool st[N];
int n;
double z, r;
double res;
map<int, int> mii;
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
int main() {
memset(h, -1, sizeof h);
cin >> n >> z >> r;
for (int i = 0; i < n; i++) {
int k, x;
cin >> k;
if (k == 0) {
cin >> x;
add(i, x);
mii[i] = x;
st[i] = true; // 是得道者
} else {
while (k--) {
cin >> x;
add(i, x);
}
}
}
queue<PID> q;
q.push({0, z});
while (q.size()) {
auto t = q.front();
q.pop();
int ver = t.first;
double pow = t.second;
if (st[ver]) {
res += pow * mii[ver];
continue;
}
for (int i = h[ver]; ~i; i = ne[i]) {
int j = e[i];
q.push({j, pow * (1 - r/100)});
}
}
cout << (int) res << endl;
return 0;
}
C++(dfs)
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, M = 2 * N;
int h[N], e[M], ne[M], idx;
bool st[N];
int n;
double z, r;
double res;
map<int, int> mii;
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
void dfs(int u, double pow) {
if (st[u]) {
res += pow * e[h[u]];
return;
}
for (int i = h[u]; ~i; i = ne[i]) {
int j = e[i];
dfs(j, pow * (1 - r/100));
}
}
int main() {
memset(h, -1, sizeof h);
cin >> n >> z >> r;
for (int i = 0; i < n; i++) {
int k, x;
cin >> k;
if (k == 0) {
cin >> x;
add(i, x);
mii[i] = x;
st[i] = true; // 是得道者
} else {
while (k--) {
cin >> x;
add(i, x);
}
}
}
dfs(0, z);
cout << (int) res << endl;
return 0;
}