分析:先输入建立一个邻接表,然后从祖宗点开始遍历!千万不从循环从小到大!遍历完祖宗接着遍历祖宗下的点,一连串下去,如果从小的点到大的点排序有的点自己还没有更新就去更新下边的点是错的!
!!!:double和int型相乘会变0 一定要转换
AC代码:
#include<bits/stdc++.h>
#include<vector>
using namespace std;
const int N=100100;
vector<int> v[N];
double ans,z,r,sum;
int n;
double vis[N];
double num[N];
void dfs(int x,double s)
{
if(vis[x])
{
ans=ans+s*vis[x];
}
for(int i=0;i<v[x].size();i++)
{
dfs(v[x][i],s*r);
}
}
int main()
{
int m,x;
scanf("%d %lf %lf",&n,&z,&r);
// cin>>n>>z>>r;
r=(100-r)/100;
for(int i=0;i<n;i++)
{
scanf("%d",&m);
if(m)
{
while(m--)
{
scanf("%d",&x);
v[i].push_back(x);
}
}
else
scanf("%lf",&vis[i]);
}
num[0]=z;
//for(int i=1;i<=n;i++)
//dfs(i,0);
dfs(0,z);
printf("%d",(int)ans);
}