题解 P7763 [COCI2016-2017#5] Ronald
洛谷。
题意
显然。
分析
对于此题,我们可以从最终状态反推。
最终状态是什么,就是我们所有的节点两两链接(下命名为全联通),而最后一步的前一步的状态是什么呢,这明显是确定的,就是一个节点单独,其他节点仍然全联通,再操作一个节点呢,不难发现,现在是两个节点全联通,剩下的全联通。
以此类推,不难证明,我们回推的图必然是两个全联通图或者是本身就是满足。
由此得到结论,如果所有的节点与其边能够构成两个或一个全联通,那么就输出 DA。
怎么判断是否全联通呢?我们只用判断边数与点数的关系即可。
若 $siz\times (siz-1)=edge\times 2$,所有节点两两联通,即为全联通。
至于连接的过程,我们用并查集维护即可。
for(int i=1; i<=m; ++i) {
int u=read(),v=read();
u=find(u),v=find(v);
if(u==v) edge[u]++;
else {
fa[v]=u;
siz[u]+=siz[v];
edge[u]+=edge[v]+1;
}
}
int cnt=0,flag=0;
for(int i=1; i<=n; ++i) {
if(fa[i]==i) {
++cnt;
if((!check(i))||cnt>2) {
cout<<"NE";
return 0;
}
}
}
cout<<"DA";

浙公网安备 33010602011771号