2014 编程之美 资格赛 第一题 同构

来源:互联网 发布:js select改变事件 编辑:程序博客网 时间:2024/05/21 11:10

看到各种大神各种染色,各种搜索求同构,真是淡淡得忧伤

首先对于一个块儿,其实它是相对独立的,即我给这个块一种染色方案,不会因为与本块相连的其它枝叶而导致该染色方案不成立。

比如对于某边,左端为点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;}


0 0