bzoj 1211

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

(周日打完比赛,自己一个人去吃了一小份鸡公煲,感觉学校里的鸡公煲,嗯,是肉,就没有更深一层的味道了闭嘴,还是酸梅汤比较好喝,但是卫生?亲眼目睹的一幕,还是有点无法接受鄙视

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[N];
	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);
		}
	}
}

posted @ 2015-09-12 17:55  buzhidaohahaha  阅读(122)  评论(0编辑  收藏  举报