看到各种大神各种染色,各种搜索求同构,真是淡淡得忧伤
首先对于一个块儿,其实它是相对独立的,即我给这个块一种染色方案,不会因为与本块相连的其它枝叶而导致该染色方案不成立。
比如对于某边,左端为点A,右端为点B,我们策略只有两种,A与B同色,A与B不同色,而除了本边之外的其它边不能决定A与B的关系,因为在这个树上,沟通A与B的边是唯一的。而块就是边的推广。
然后对于本题。。很显然连续的一段儿我们们会对它进行间隔染色。那么什么样的块不可避免地只有同一种颜色?:对于一个度为n的点,一定会产生一个以该点为顶点,连接有(n+1)/2个度为1的点的块。所以问题就转换成了B是不是A中所产生的最大同色块(度最大的点产生)的一个子块。
所以判断一下读书,数一数,搞一搞就好啦。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int n1,n2;
int du1[1000005];
int du2[1000005];
int main()
{
int T,ans;
int R=0;
scanf("%d",&T);
while(T--)
{
R++;
int i,j,ta,tb,fuck1=0,cn1=0,fuck2=0;
memset(du1,0,sizeof(du1));
memset(du2,0,sizeof(du2));
scanf("%d",&n1);
for(i=1;i<n1;i++)
{
scanf("%d%d",&ta,&tb);
du1[ta]++;
du1[tb]++;
}
for(i=1;i<=n1;i++)
if(du1[i]>fuck1)
fuck1=du1[i];
scanf("%d",&n2);
for(i=1;i<n2;i++)
{
scanf("%d%d",&ta,&tb);
du2[ta]++;
du2[tb]++;
}
for(i=1;i<=n2;i++)
{
if(du2[i]==1)
cn1++;
if(du2[i]>fuck2)
fuck2=du2[i];
}
if(fuck2==1)
cn1--;
if(fuck2==cn1&&cn1==n2-1&&(fuck2<=(fuck1+1)/2))
printf("Case %d: NO\n",R);
else
printf("Case %d: YES\n",R);
}
return 0;
}