编程之美测试赛第二题—大神与三位小伙伴

大神与三位小伙伴

时间限制:
2000ms 单点时限:
1000ms 内存限制:
256MB

描述

给定2个树A和B,保证A的节点个数>=B的节点个数。

现在你需要对树A的边进行二染色。

一个好的染色方案,指不存在一个树A中的连通块,同时满足以下2个条件

1. 其中只有同色的边

2. 和B同构。两个树同构是指,存在一个一一映射(既是单射又是满射),将树B的各节点映射到不同的树A的节点,使得原来在树B中相邻的点,在映射后,仍相邻。

问是否存在一种好的染色方案。

输入

第一行一个整数T (1<=T<=10),表示数据组数。

接下来是T组输入数据,测试数据之间没有空行。

每组数据格式如下:

第一行一个整数N ,表示树A的节点总数。

接下来N-1行,每行2个数a, b (1 <= a, b <= N)表示树A的节点a和b之间有一条边。

接下来一行,一个整数M(1 <= M <= N),表示树B的节点总数。

接下来M-1行,每行2个数a, b (1 <= a, b <= M)表示树B的节点a和b之间有一条边。

输出

对每组数据,先输出“Case x: ”,x表示是第几组数据,然后接“YES”/“NO”,表示是否存在所求的染色方案。

数据范围

小数据:1 <= N <= 20

大数据:1 <= N <= 1000000

样例解释

无论如何染色,只要从A中挑一条边就行了。

样例输入

1
3
1 2
2 3
2
1 2

样例输出

Case 1: NO

  • 此题比较简单,自己推了一下数学公式,基本上就一次性AC了。1^3+2^3+…+n^3+i*j*k*6对不同ijk求和(i<j<k)
  • 下面是AC代码,第一题没看懂题目,第三题感觉很难考虑的问题太多,应该是DFS+剪枝吧。细细的想象。。。。。
  • #include<iostream>
    using namespace std;
    long long ans=0;
    const int maxn=1e9+7;
    
    int main(){
    	int T,n;
    	cin>>T;
    	for(int count=1;count<=T;count++){
    		cin>>n;
    		ans=0;
    		for(int i=1;i<=n;i++)
    			ans=(ans+i*i*i)%maxn;
    		for(int i=1;i<=n-2;i++)
    			for(int j=i+1;j<=n-1;j++)
    				for(int k=j+1;k<=n;k++)
    					ans=(ans+i*j*k*6)%maxn;
    		cout<<"Case "<<count<<":"<<ans<<endl;
    	}
    	return 0;
    }
    原文作者:爱玩的凌风
    原文地址: https://blog.csdn.net/u013077167/article/details/44984305
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞