补题的时候,忘记将怪兽节点的size值变为0。
#include<bits/stdc++.h>
using namespace std;
int fa[200005],siz[200005];
int getfa(int x)
{
int fx=fa[x];
if(fx!=x)
{
fa[x]=getfa(fx);
}
return fa[x];
}
void join(int x,int y)
{
int fx=getfa(x);
int fy=getfa(y);
if(fx!=fy)
{
fa[fx]=fy;
siz[fy]+=siz[fx];
}
}
struct node{
int x,y;
}a[200005];
int b[200005];
int ans=0;
vector<int>v[200005];
vector<int>g;
int vis[200005];
void dfs(int x)
{
//ans++;
siz[x]=0;
vis[x]=1;
for(int i=0;i<v[x].size();i++)
{
if(b[v[x][i]]==1)
{
g.push_back(v[x][i]);
continue;
}
if(!vis[v[x][i]])
{
dfs(v[x][i]);
}
}
}
int main()
{
int t,n,k,m,x,y;
scanf("%d",&t);
while(t--)
{
ans=0;
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<=n;i++)
{
fa[i]=i;
siz[i]=1;
vis[i]=0;
v[i].clear();
b[i]=0;
}
g.clear();
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
v[a[i].x].push_back(a[i].y);
v[a[i].y].push_back(a[i].x);
}
for(int i=1;i<=k;i++)
{
scanf("%d",&x);
b[x]=1;
}
for(int i=1;i<=m;i++)
{
if(b[a[i].x]==0&&b[a[i].y]==0)
{
join(a[i].x,a[i].y);
}
}
ans=siz[getfa(1)];
dfs(1);
double sum=0;
for(int i=0;i<g.size();i++)
{
int x=g[i];
double t=0;
for(int j=0;j<v[x].size();j++)
{
int to=v[x][j];
if(b[to]==1)
continue;
to=getfa(to);
t+=siz[to];
}
t=ans+t/v[x].size();
sum=max(t,sum);
}
printf("%f\n",sum);
}
return 0;
}