您的位置:首页 > 其它

bzoj 1211

2015-09-12 17:55 183 查看
prufer序列:

参考链接:http://hzwer.com/3272.html

证明:一个序列必定对应着一棵合法的树

假设共有n个点,编号从1到n:

首先,n个点之间连了n-1条边;

其次,证,n个点之间不会出现环:假设环中最后添加进来的一条边是a,b,与a相连的另一个点是c,与b相连的另一个点是d,假设a是从x中选出来的,b是从y中选出来的,可知,a,c这条边中的a只能是从y中选出来的,b,c这条边中的b只能是从y中选出来的,所以c,d必定是从x中选来的,这个环继续延伸,必定会出现一条边两个点都要从y中选出来,这是不可能的,所以一定不会出现环。

综上所述,由特定数组成的序列和合法的树一一对应。

所以这道题最后演化成求一串数的排序方式。

用java交题,不用加包(否则会re),并且类名是Main.(经过后续验证,不加包反而会ce,加了包才能ac,前一段时间得到的结果怎么和现在的差距这么大呢?



代码参考:http://www.cnblogs.com/zhj5chengfeng/p/3278557.html

(周日打完比赛,自己一个人去吃了一小份鸡公煲,感觉学校里的鸡公煲,嗯,是肉,就没有更深一层的味道了

,还是酸梅汤比较好喝,但是卫生?亲眼目睹的一幕,还是有点无法接受



2015.10.30:

话说csdn还是挺好看的,除了速度慢点,除了不知道存不存在的可以备份到自己电脑上的功能,除了想按立即保存,不小心按成了舍弃,除了……,其实csdn还是挺好的。


import java.math.BigInteger;
import java.util.*;

public class Main {
static Scanner in=new Scanner(System.in);
static int N=160;
static int[] num=new int
;
static int n;
static int a;
static int sum;
static boolean pd=true;
static BigInteger ans=new BigInteger("1");
static BigInteger temp=new BigInteger("1");
static BigInteger now=new BigInteger("1");
static BigInteger addnum=new BigInteger("1");

static public void main(String args[]){
n=in.nextInt();
for(int i=0;i<=n;i++){
num[i]=0;
}
for(int i=1;i<=n;i++){
a=in.nextInt();
if(a<0||a>n-1){//判断该能不能构成树。
pd=false;
}
else{
if(a==0){//当一棵树只有一个点时,度数可以有0,但是如果大于一个点时就不能存在度数为0的点,所以这点要单独拿出来判断。
pd=false;
}
sum+=a;
num[a]++;
}
}
in.close();

if((n!=1&&pd==false)||sum!=(2*n-2)||(n==1&&num[0]==0)){
System.out.println("0");
}
else if(n==1&&num[0]!=0){
System.out.println("1");
}
else{
for(int i=1;i<=n-2;i++){
ans=ans.multiply(now);
now=now.add(addnum);
}

now=now.subtract(now);
now=now.add(addnum);

for(int i=1;i<=n-1;i++){
temp=temp.multiply(now);
now=now.add(addnum);
for(int j=1;j<=num[i+1];j++){
ans=ans.divide(temp);
}
}
System.out.println(ans);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: