题目详情 - L2-020 功夫传人 (pintia.cn)
先理解下题目:看下人家的输入,对于得道者是没有徒弟的。
坑点(测试点1):祖师爷是得道者门派就他一个人。
DFS
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n;
double z, r, sum;
pair<int, int> sp[N];
vector<int> v[N];
void dfs(int u, int h)
{
for (auto x : v[u])
{
if (sp[x].first == 1)
sum += z * pow(r, h) * sp[x].second;
dfs(x, h + 1);
}
}
int main()
{
cin >> n >> z >> r;
r = 1 - r / 100;
for (int i = 0;i < n;i++)
{
int cnt;cin >> cnt;
if (cnt == 0)
{
int tmp;cin >> tmp;
sp[i].first = 1;
sp[i].second = tmp;
}
while (cnt--)
{
int tmp;cin >> tmp;
v[i].push_back(tmp);
}
}
dfs(0, 1);
if(n==1&&sp[0].first==1)
{
cout<<(int)(z*sp[0].second);
return 0;
}
cout << (int)sum;
}
BFS 两种bfs写法 (对于层数的赋值逻辑不同)
1.推荐的BFS写法(开一个数组记录点所在的层数)
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n;
double z, r,sum;
vector<int> v[N];
pair<int, int> sp[N];
int d[N];
float bfs()
{
queue<int> q;
q.push(0);
d[0] = 0;
while (q.size())
{
int t = q.front();
q.pop();
for (auto x : v[t])
{
q.push(x);
d[x] = d[t] + 1;
if (sp[x].first == 1)
sum += z * pow(r, d[x]) * sp[x].second;
}
}
return sum;
}
int main()
{
cin >> n >> z >> r;
r=1-r/100;
for (int i = 0;i < n;i++)
{
int cnt;cin >> cnt;
if (cnt == 0)
{
int tmp;cin >> tmp;
sp[i].first = 1, sp[i].second = tmp;
}
while (cnt--)
{
int tmp;cin >> tmp;
v[i].push_back(tmp);
}
}
if(n==1&&sp[0].first==1)
{
cout<<(int)(z*sp[0].second);
return 0;
}
cout << (int)bfs();
}
2.另一种
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n;
double z, r,sum;
vector<int> v[N];
pair<int, int> sp[N];
float bfs()
{
queue<int> q;
//float sum = 0;//一开始把sum写这了。。不行得放全局变量那
q.push(0);
int step = 1;
while (q.size())
{
int cnt = q.size();
while (cnt--)
{
int t = q.front();
q.pop();
for (auto x : v[t])
{
q.push(x);
if (sp[x].first == 1)
{
sum += z * pow((1 - r / 100), step) * sp[x].second;
}
}
}
step++;
}
return sum;
}
int main()
{
cin >> n >> z >> r;
for (int i = 0;i < n;i++)
{
int cnt;cin >> cnt;
if (cnt == 0)
{
int tmp;cin >> tmp;
sp[i].first = 1;
sp[i].second = tmp;
}
while (cnt--)
{
int tmp;cin >> tmp;
v[i].push_back(tmp);
}
}
if(n==1&&sp[0].first==1)
{
cout<<(int)(z*sp[0].second);
return 0;
}
cout << (int)bfs();
}