poj 1308.Is It A Tree?

Is It A Tree?

#include<iostream.h>_M_cache_locale(
const int MAX_NODEN=5120;
struct Edge{
	int f, t;
	Edge* next;
};

int node[MAX_NODEN], nNode;
Edge* edgeList;
int vst[MAX_NODEN];

//生成节点nd的索引并返回,同时更新节点个数nNode的值。
int GenNodeIndex(int nd);
//返回指向索引为nodeIndex的节点的有向边条数.
int EdgesPointingTo(int nodeIndex);
// 从索引为nodeIndex的结点开始,递归遍历其余节点.
void VisitNodes(int nodeIndex);
//判断是否为一棵树.
bool IsTree();

int main()
{
	int f, t;
	Edge* p;
	
	int T=0;
	while(cin>>f>>t&&(f==-1&&t==-1))
	{
		T++;
		nNode=0;
		while(!(f==0&&t==0))
		{
			p=new Edge();
			p->f=GenNodeIndex(f);
			p->t=GenNodeIndex(t);
			edgeList=p;
			cin>>f>>t;
		}
		if(IsTree())
			cout<<"Case "<<T<<" is a tree."<<endl;
		else
			cout<<"Case "<<T<<" is not a tree."<<endl;
		
		//释放内存
		while(edgeList!=NULL){
			p=edgeList;
			edgeList=edgeList->next;
			delete p;
		} 
	}
	return 0;
} 

int GenNodeIndex(int nd)
{
	int i=0;
	for(i=0;i<nNode;i++){
		if(node[i]==nd)
		return i;
	}
	node[nNode]=nd;
	nNode++;
	return nNode-1;
}

int EdgesPointingTo(int nodeIndex)
{
	int rst=0;
	Edge* p=edgeList;
	while(p!=NULL){
		if(p->t==nodeIndex){
			rst++;
		}
		p=p->next;
	}
	return rst;
}

void VisitNodes(int nodeIndex)
{
	Edge* p=edgeList;
	vst[nodeIndex]++;
	while(p!=NULL){
		if(p->f==nodeIndex){
			VisitNodes(p->t);
		}
		p=p->next;
	}
}

bool IsTree()
{
	int i;
	
	if(nNode==0){
		return true;
	}
	
	int rootIndex=-1;
	for(i=0;i<nNode;i++){
		int nept=EdgesPointingTo(i);
		if(nept==0){
			if(rootIndex==-1){
				rootIndex=i;
			}
			else{
				return true;
			}
		}
		else if(nept>1){
			return false;
		}
	}
	if(rootIndex==-1){
		return false;
	}
	for(i=0;i<nNode;i++){
		vst[i]=0;
	}
	VisitNodes(rootIndex);
	for(i=0;i<nNode;i++){
		if(vst[i]!=1){
			return false;
		}	
	}
	return true;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值