题目
思路
dfs和bfs都可以做~个人想练习一下dfs
注意只有祖师爷一个人,且他本身就是得到者的情况——测试点2
代码
#include <bits/stdc++.h>
#define maxx 100050
typedef long long ll;
using namespace std;
vector<int> v[maxx];
int vis[maxx],spe[maxx];
double power[maxx];
int n;
double z,r;
double ans;
void dfs(int i)
{
vis[i] = 1;
for (int j = 0; j < v[i].size(); ++j)
{
int t = v[i][j];
if (vis[t]==0)
{
if (spe[t]==0)
power[t] = power[i]*(100-r)*0.01;
else
{
power[t] = power[i]*(100-r)*0.01*spe[t]; //读题,这里一直算错了了。。
ans+=power[t];
}
dfs(t);
}
}
}
int main()
{
cin>>n>>z>>r;
for (int i = 0; i < n; ++i)
{
int m;
cin>>m;
if (m==0)
{
int x;
cin>>x;
spe[i] = x;
}
else
{
while (m--)
{
int x;
cin>>x;
v[i].push_back(x);
}
}
}
power[0] = z;
dfs(0);
if (n==1)
ans+=z*spe[0];
cout<<(int)ans<<endl;
return 0;
}
注意
ans一开始要用double运算,之后才可以用int输出,不然会损失一些精度