码迷,mamicode.com
首页 > 其他好文 > 详细

hdu5423 Rikka with Tree(DFS)

时间:2015-08-30 01:07:15      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:c语言   hdu   搜索   

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5423

题目大意:BC round# 53上有中文题意= =

思路:画图可以发现,其实题目本身不难。因为他有n个点,n条边,所以可以确定只有一棵树。

对于树中的某一个点来说,如果他有多个分支,然后分支下面又有边连出去,那么这种情况就一定是NO了。

比如1和2、3相连,然后2又与4相连,3与5相连,那么4和5就可以调换位置,此时这颗树就不是特殊的了。

所以我可以利用深搜记录下所有点的深度,对深度排序以后,如果有一种深度超过2个及以上,就看是否有比他深的点,如果有就是NO,否则是YES。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define M 1005
using namespace std;
struct node{
	int to,next;
}edge[M*100];
int head[M*2];
int n,tot,ans[1005],q,vis[1005];
void add(int a,int b)
{
	edge[tot].to=b;
	edge[tot].next=head[a];
	head[a]=tot++;
}
int t=0;
void dfs(int x,int deep)
{
	int i,j;
	vis[x]=1;
	for(i=head[x];i!=-1;i=edge[i].next)
	{	
	
	j=edge[i].to;
	if(vis[j])continue;
	vis[j]=1;
	dfs(j,deep+1);
	}
	ans[q++]=deep;
	return;
}
int main()
{
  int i,j,u,v;
  while(scanf("%d",&n)!=EOF)
  {
  	q=0;
  	memset(vis,0,sizeof(vis));
  	memset(head,-1,sizeof(head));
  	tot=0;
  	for(i=1;i<n;i++)
  	{
	  	scanf("%d%d",&u,&v);
	  	add(u,v);
	  	add(v,u);   //建树
	  }
	  int deep=0,f;
	  f=0;
	dfs(1,0);
	int as=0,mark=0;
	sort(ans,ans+q-1);
	for(i=1;i<q-1;i++)
	{
	if(ans[i]==ans[i-1]){mark=1; as=ans[i];}   //判断是否有两个一样的深度。即判断是否有分支。
     if(ans[i]>as&&mark)f=1;     //在分支下如果还有点,就是NO了。
  }
	
 	if(f)printf("NO\n");
 	else printf("YES\n");
  }	
  return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu5423 Rikka with Tree(DFS)

标签:c语言   hdu   搜索   

原文地址:http://blog.csdn.net/aaaaacmer/article/details/48093767

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!