CF1829F Forever Winter 题解

· · 题解

大家好,我是 CQ-C2024 蒟蒻 CJH。

题意

一个雪花图可以通过两个大于 1 的整数 xy 生成,具体步骤如下:

给你一个雪花图,请找出它的 xy

分析

观察题面图片可以发现,一个雪花图一定是一棵无根树。

也就是说,我们求 x 只需要求出树的重心即可,x 的值即为重心的出度。

## 注意事项 **本题有多组数据。** 所以一定要把存图的 `vector` 清空! ## 代码 ```cpp //the code is from chenjh #include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; int n,m; vector<int> G[202]; int rt,s[202],dp[202];。 bool vis[202]; void dfs(int x,int fa,const int sum){//求树的重心。 s[x]=1,dp[x]=0; for(int v:G[x]) if(v!=fa && !vis[v]){ dfs(v,x,sum); s[x]+=s[v];//统计子树大小。 dp[x]=max(dp[x],s[v]); } dp[x]=max(dp[x],sum-s[x]); if(dp[x]<dp[rt]) rt=x; } void solve(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) G[i].clear();//多测要清空邻接表! for(int i=1,u,v;i<=m;i++)scanf("%d%d",&u,&v),G[u].push_back(v),G[v].push_back(u); rt=0,dp[0]=202;memset(vis,0,sizeof vis);//清空访问数组。 dfs(1,0,n); printf("%d %d\n",(int)G[rt].size(),(int)G[G[rt][0]].size()-1);//重心的出度和重心任意一个子节点出度减去一。 } int main(){ int T;scanf("%d",&T); while(T--) solve(); return 0; } ```