n有区别么? 实在不能理解
//acmer mxc
#include <bits/stdc++.h>
#define int long long
#define dd double
#define sc(x) cout<<#x<<" : "<<x<<endl;
using namespace std;
const int N=2e5+5;
int d[N],v[N];
int head[N],nnext[N],edge[N],ver[N];
int size[N];
int tot=1;
int ans=0,k;
void add(int x,int y)
{
ver[++tot]=y;
nnext[tot]=head[x],head[x]=tot;
}
void init()
{
memset(head,0,sizeof(size));
memset(head,0,sizeof(head));
memset(head,0,sizeof(nnext));
memset(head,0,sizeof(edge));
memset(head,0,sizeof(ver));
memset(head,0,sizeof(d));
memset(head,0,sizeof(v));
tot=1;
ans=0;
}
void dfs(int x,int fa)
{
size[x]=1;
for(int i=head[x];i;i=nnext[i])
{
int y=ver[i];
if(y==fa) continue;
dfs(y,x);
size[x]+=size[y];
}
if(size[x]==k) ans++,size[x]-=k;
}
void solve()
{
init();
int m;
scanf("%lld%lld",&m,&k);
for(int j=1;j<m;j++)
{
int a,b;
scanf("%lld%lld",&a,&b);
add(a,b);
add(b,a);
}
dfs(1,-1);
if(m%k!=0)
{
puts("NO");
return;
}
if(ans==m/k)puts("YES");
else puts("NO");
}
signed main()
{
int T=1;
cin>>T;
for(int i=1;i<=T;i++)
{
solve();
}
return 0;
}
//acmer mxc
#include <bits/stdc++.h>
#define int long long
#define dd double
#define sc(x) cout<<#x<<" : "<<x<<endl;
using namespace std;
const int N=1e5+5;
int d[N],v[N];
int head[N],nnext[N],edge[N],ver[N];
int size[N];
int tot=1;
int ans=0,k;
void add(int x,int y)
{
ver[++tot]=y;
nnext[tot]=head[x],head[x]=tot;
}
void init()
{
memset(head,0,sizeof(size));
memset(head,0,sizeof(head));
memset(head,0,sizeof(nnext));
memset(head,0,sizeof(edge));
memset(head,0,sizeof(ver));
memset(head,0,sizeof(d));
memset(head,0,sizeof(v));
tot=1;
ans=0;
}
void dfs(int x,int fa)
{
size[x]=1;
for(int i=head[x];i;i=nnext[i])
{
int y=ver[i];
if(y==fa) continue;
dfs(y,x);
size[x]+=size[y];
}
if(size[x]==k) ans++,size[x]-=k;
}
void solve()
{
int n;
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
init();
int m;
scanf("%lld%lld",&m,&k);
for(int j=1;j<m;j++)
{
int a,b;
scanf("%lld%lld",&a,&b);
add(a,b);
add(b,a);
}
dfs(1,-1);
if(m%k!=0)
{
puts("NO");
return;
}
if(ans==m/k)puts("YES");
else puts("NO");
}
}
signed main()
{
int T=1;
for(int i=1;i<=T;i++)
{
solve();
}
return 0;
}

这篇博客探讨了如何利用并查集(Disjoint Set Union,DSU)数据结构解决图论中的连通性问题。通过两个C++实现示例,展示了在不同场景下DSU的使用,包括初始化、添加边、求解连通分量等操作。博主acmermxc深入浅出地解释了DSU的工作原理,并通过实际的代码运行情况验证了算法的正确性。此外,文章还讨论了当图中边的数量与连通分量的关系,以及在连通性判断中的应用。
691

被折叠的 条评论
为什么被折叠?



