P10179 水影若深蓝 题解
抽象题意
已知树
构造树
构建模型
我们设
约束转为:①
下证,若存在树
对于任意满足约束 且 层数
证毕。
求解问题
考虑已知
先将所有与
再将所有与第
以次类推,类似搜索联通块。
余下的节点加入第
第
有解时,将
问题:如何求
构建图论模型,对于所有约束
第一层:
第三层:
第二层:
代码实现
两种方法:
① DFS
② 并查集
后者代码:
#include<bits/stdc++.h>
using namespace std;
const int N=300005;
int T,n,m;
int fa[N];
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void merge(int u,int v){
u=find(u),v=find(v);
fa[u]=v;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) fa[i]=i;
while(m--){
int u,v;scanf("%d%d",&u,&v);
merge(u,v);
}
int f=find(1);
int x=-1;
for(int i=2;i<=n;i++){
if(f!=find(i)){x=i;break;}
}
if(x==-1){puts("No");continue;}
puts("Yes");
for(int i=2;i<=n;i++){
if(f!=find(i)) printf("%d %d\n",1,i);
}
for(int i=2;i<=n;i++){
if(f==find(i)) printf("%d %d\n",x,i);
}
}
return 0;
}