现在的位置: 首页 > 综合 > 正文

POJ 1308 Is It A Tree?

2017年10月12日 ⁄ 综合 ⁄ 共 1042字 ⁄ 字号 评论关闭

题目大意:

如果一组数据

1.只有唯一的根节点

2.除根节点外的每一个点都有上级

3.图中没有环状物(看上去没有环)

那么就是一棵树,否则不是。

那么仔细想想,只要点的数目==边的数目-1 && 每个点没有两个上级

就成立。

我们可以抛弃并查集的结构,,,只需记录每个点的存在性以及上级的有无就可以判断所有。

然后是存储的方式。。

一开始写的递推。。。莫名原因错了。

果断改了数组储存每条边。。

果断AC

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
#define MAX 101
int times = 1,lines,point;
int beg[MAX],end[MAX];
bool ok = true,out[MAX],poi[MAX];
int work()//判断是否是树 
{
	if ( ( point == lines + 1 || lines < 1 ) && ok == true )
	{
		printf("Case %d is a tree.\n",times);
	}
	else
	{
		printf("Case %d is not a tree.\n",times);
	}
	return 1;
}
void addp(int x)//更新点的数目 
{
	if ( poi[x] == false )
	{
		poi[x] = true;
		point++;
	}
}
int init()
{
	while(++lines)
	{
		scanf("%d %d",&end[lines],&beg[lines]);
		if ( beg[lines] == 0 )
		{//若读取完毕,进入下一环节 
			lines--;
			break;
		}
		else if ( beg[lines] < 0 )
		{//若全部完毕,返回0结束main中的循环 
			return 0;
		}
	}
	for (int i = 1; i <= lines; i++)
	{
		addp(beg[i]);
		addp(end[i]);
		if ( out[ beg[i] ] == true )
		{
			ok = false;
			break;
		}
		else
		{
			out[ beg[i] ] = true;
		}
		//更新边的起点的上级,若有一个上级就不是树 
	}
	work();
	for (int i = 1; i <= lines; i++)
	{//全部调成初始状态 
		poi[beg[i]] = false;
		poi[end[i]] = false;
		out[beg[i]] = false;
	}//本组数据成功结束,返回1使main继续循环 
	return 1;
}
int main()
{
	while(init())
	{
		ok = true;
		lines = 0;
		point = 0;
		times++;
	}
	return 0;
}

抱歉!评论已关闭.