Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

哪位大牛给组测试数据吧。。。Wrong Answer 了N次了。。。额的代码呈上。。。

Posted by jlw686 at 2008-04-21 21:43:41 on Problem 1848
#include <stdio.h>
#include <memory.h>

#define DF_VAIN (0xFFFF)
#define DF_MINNUM (-9999)
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))

int N;
int root;
int father[110];
int child[110];
int brother[110];
int f[110];//f[i]以i为根的树的最小连接数
int F[110];//F[i]以i为根的树min(FfromChild[i],去掉根i后的最小链接数)
int FfromChild[110];//去掉根i和一个链后的最小链接数

bool Process(int _root)//有三个兄弟无效则无解
{//在孩子里面找f-F最大的两个,至少有一个孩子
	int index=child[_root];
	int maxVal1=DF_MINNUM,maxVal2=DF_MINNUM,maxSubChild=DF_MINNUM,maxSubChildIndex=-1;
	bool bFfromChild=true;//FfromChild[index]==f[index]==DF_VAIN则为false
	int sum=0;
	int vainCount=0;
	while (index)
	{//在child中不会有F[index]==DF_VAIN&&f[index]==DF_VAIN,但可能有FfromChild[index]==DF_VAIN&&f[index]==DF_VAIN
		sum+=f[index];
		vainCount+=(f[index]==DF_VAIN?1:0);
		if (vainCount>2)
		{//此时对外连线和内部连线都不行
			f[index]=F[index]=DF_VAIN;
			return false;
		}
		if (F[index]==DF_VAIN)
		{//index节点外部连线不行,此时FfromChild[index]==DF_VAIN,但f[index]!=DF_VAIN
			index=brother[index];
			continue;
		}
		if (FfromChild[index]!=DF_VAIN)
		{
			int curChildSubVal=f[index]-FfromChild[index];
			maxSubChild=max(curChildSubVal,maxSubChild);
		}
		else if (f[index]==DF_VAIN)
		{
			bFfromChild=false;
		}
			
		int curVal=f[index]-F[index];
		curVal>maxVal1?(maxVal2=maxVal1,maxVal1=curVal)
			:(curVal>maxVal2?(maxVal2=curVal):0);
		index=brother[index];
	}
	FfromChild[_root]=(vainCount>1||maxVal1==DF_MINNUM)?DF_VAIN:(sum-maxVal1);
	F[_root]=min(FfromChild[_root],(vainCount?DF_VAIN:sum));
	f[_root]=(vainCount>2||maxVal2==DF_MINNUM)?(DF_VAIN):(sum-maxVal1-maxVal2+1);//勿忘加一
	f[_root]=min(f[_root],((vainCount>1||maxSubChild==DF_MINNUM||!bFfromChild)
			?DF_VAIN:(sum-maxSubChild+1)));

	return f[_root]!=DF_VAIN||F[_root]!=DF_VAIN;
}

bool dfs(int _root)
{//中序遍历
	if (!child[_root])
	{
		f[_root]=DF_VAIN;
		FfromChild[_root]=DF_VAIN;
		F[_root]=0;
	}
	else
	{
		if(!dfs(child[_root])) return false;
		if(!Process(_root)) return false;
	}
	if(brother[_root]&&!dfs(brother[_root])) return false;
	return true;
}

void Init()
{
	int i,tmp1,tmp2;
	memset(father,0,sizeof(father));
	memset(child,0,sizeof(child));
	memset(brother,0,sizeof(brother));
	//建树
	scanf("%d%d",&root,&tmp1);
	child[root]=tmp1;father[tmp1]=root;
	for (i=2;i<=N-1;i++)
	{
		scanf("%d%d",&tmp1,&tmp2);
		if(father[tmp2])//tmp1优先当根
		{//tmp2已有父亲,则交换tmp1,tmp2
			int tmpswap=tmp1;
			tmp1=tmp2;tmp2=tmpswap;
		}
		father[tmp2]=tmp1;	
		if (root==tmp2)
		{
			int tmproot=tmp1;
			while(father[tmproot]) tmproot=father[tmproot];//修改
			root=tmproot;
		}
		if (child[tmp1])
		{
			int tmpIndex=child[tmp1];
			while (brother[tmpIndex])
				tmpIndex=brother[tmpIndex];
			brother[tmpIndex]=tmp2;
		}
		else
			child[tmp1]=tmp2;
	}
}

int main(int argc, char* argv[])
{
	while (EOF!=scanf("%d",&N))
	{
		Init();
		if(!dfs(root)||f[root]==DF_VAIN) printf("-1\n");
		else printf("%d\n",f[root]);
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator