逃跑
链式前向星建图
这一题主要想学习一下链式前向星,附上别人的思路
cpp
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
struct edge
{
int v,ne;
};
edge e[2000006];
int h[1000006];
int cnt;
void add(int u,int v)
{
e[++cnt]={v,h[u]};
h[u]=cnt;
}
int t;
double f[1000006];
bool flag[1000006];
double p;
void dfs(int u,int fa)
{
if(flag[u]) t++;
for(int i=h[u];i;i=e[i].ne)
{
int v=e[i].v;
if(v==fa) continue;
if(flag[u]) f[v]=f[u]+1;
else f[v]=f[u]+pow(p,t);
dfs(v,u);
}
if(flag[u]) t--;
}
int main()
{
ll n,m;
cin>>n>>m>>p;
for(int i=0;i<n-1;i++)
{
int u,v;
cin>>u>>v;
add(u,v);
add(v,u);
}
for(int i=0;i<m;i++)
{
int a;
cin>>a;
flag[a]=1;
}
dfs(1,0);
double sum=0;
for(int i=1;i<=n;i++) sum+=f[i];
printf("%.2f",sum/(double)n);
return 0;
}