I、马拉松
设sum【i】为X或Y 周围的且不在XY路径上的点
所以这题的答案 就是从sum【x】中选一个起点,sum【y】中选一个终点,答案就是 sum【x】*sum【y】
可以用dfs实现
void dfs(int u ,int pa) //dfs是有方向的
{
sum[u] = 1;
for(auto now :v[u])
{
if(now == pa) continue;
else{
dfs(now,u);
sum[u] += sum[now];
//在xy的路径上
if(f[now]&&u==x) sum[u] -= sum[now];
if(f[now]) f[u]=1;
}
}
}
void solve()
{
cin>>n>>x>>y;
for(int i=1;i<=n-1;i++)
{
int g,h;
cin>>g>>h;
v[g].pb(h);
v[h].pb(g);
}
f[y] = 1;
dfs(x,0);
cout<<sum[x]*sum[y]<<endl;
for(int i=1;i<=15;i++) cout<<i<<" "<<sum[i]<<endl;
return;
}
标签:pb,联赛,int,sum,dfs,2024,萌新,now
From: https://www.cnblogs.com/SonyaXu/p/18352368