dfs(用了邻接表)(25分)
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int fa[N];
int n;
double z,r,sum;
vector<int> E[N];//邻接表
int vis[N];
void dfs(int s,double w)
{
if(vis[s])
{
sum=sum+w*vis[s];
return;
}
for(int i=0;i<E[s].size();i++)
dfs(E[s][i],w*r);
}
int main()
{
cin>>n>>z>>r;
r=(1-r/100.0);
for(int i=0;i<n;i++)
{
int k;
int v;
cin>>k;
if(!k)
{
cin>>vis[i];
}
else
for(int j=0;j<k;j++)
{
cin>>v;
E[i].push_back(v);
}
}
dfs(0,z);
printf("%d",(int)sum);
return 0;
}
并查集(20分) 有两个测试点超时,被卡成了狗
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int fa[N];
int n;
double z,r,sum;
double a[N]={0};
int num;
void init()
{
for(int i=0;i<n;i++)
fa[i]=i;
}
int find(int x)
{
num=0;
while(x!=fa[x])
{
x=fa[x];
num++;
}
return x;
}
void merge(int a,int b)
{
int t=a;
a=find(a);
b=find(b);
if(a!=b)
fa[b]=t;
}
int main()
{
scanf("%d %lf %lf",&n,&z,&r);
//cin>>n>>z>>r;
init();
for(int i=0;i<n;i++)
{
int k;
scanf("%d",&k);
// cin>>k;
if(k!=0)
{
int x;
for(int j=0;j<k;j++)
{
scanf("%d",&x);
//cin>>x;
merge(i,x);
}
}
else scanf("%lf",&a[i]);
//cin>>a[i];
}
for(int i=0;i<n;i++)
{
if(a[i])
{
find(i);
double t=pow((1.0-(r/100.0)),num);
t=1.0*t*a[i]*z;
sum+=t;
}
}
int ans=sum;
printf("%d",ans);
return 0;
}