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

为什么总是WA呀,有没有好点的测试数据啊???花了好几个小时了。

Posted by Aimy at 2004-03-14 09:37:20 on Problem 1308
到底那儿错了啊?
自己的给的测试数据都过了的,什么样的数据会不过呀?

#include <iostream.h>
class Node{
public:
	int id;
	bool isFather;
	bool isChild;
	Node *father;
	Node *next;
	Node(int id) {
		this->id = id;
		next = NULL;
		father = NULL;
		isFather = false;
		isChild = false;
	}
	~Node() {
		if(next) delete next;
	}
};

/*void print(Node *n) {
	cout<<"Node "<<n->id<<": ";
	if( n->isFather && n->isChild)  cout<<"isFather    isChild:"<<n->father->id;
	if( n->isFather &&!n->isChild)  cout<<"isFather    ";
	if(!n->isFather && n->isChild)  cout<<"            isChild:"<<n->father->id;
	cout<<endl;
	if(n->next!=NULL) print(n->next);
}*/

void main() {
	int father,child;
	bool isTree;
	Node *fatherNode;
	Node *head,*temp,*tail,*t,*root,*p;
	int num=0;
	while(true) {
		num++;
		isTree = true;
		head = NULL;
		cin>>father>>child;
		if(father<0 && child<0) break;
		temp = new Node(father); temp->isFather = true;head = temp; tail = temp; fatherNode = temp;
		temp = new Node(child); temp->isChild = true; temp->father=fatherNode; tail->next = temp; tail = temp; 

		//print(head);
		while(true) {
			cin>>father>>child;
			if(father==0 && child ==0) break;
			t = head;
			while(t!=NULL) {
				if(t->id == father ) break;
				t = t->next;
			}
			if(t == NULL) {
				temp = new Node(father); 
				temp->isFather = true;
				tail->next = temp;
				tail = temp;
				fatherNode = temp;
			}
			else {
				t->isFather = true;
				fatherNode = t;
			}
			//////////////////////// 下面处理新输入的子节点
			
			t=head;
			while(t!=NULL) {
				if(t->id == child ) break;
				t = t->next;
			}

			if(t==NULL) {
				temp = new Node(child);
				temp->isChild = true;
				temp->father = fatherNode;
				tail->next = temp;
				tail = temp;
			}
			else {
				if(t->isChild == true) {
				//有两条边指向了这个节点了,不是Tree了
					isTree = false;
					while(true) {
						cin>>father>>child;
						if(father==0 && child==0) break;
					}
					//cout<<"Node "<<t->id<<" has two fathers"<<endl;
					break;
				}
				else {
					t->isChild = true;
					t->father = fatherNode;
				}
			}
			//cout<<"\\\\\\\\\\\\\\\\\\\\\\gooood"<<endl;
			//print(head);
		}
		if(isTree == false ) cout<<"Case "<<num<<" is not a tree."<<endl;
		
		else {
			int rootnum = 0;
			
			for(t=head; t!=NULL; t=t->next) {
				if(!t->isChild) { rootnum++; root = t;}
			}

			if(rootnum==1) {
				//注意有圈的情况
				isTree = true;
				for(t=head->next;t!=NULL;t=t->next){
					if(t==root) continue;
				
					temp = t->father;
					p = t;
					while(true) { //循环检查是否含有圈
						if(p==temp) {isTree = false; break;}
						if(temp->father == NULL || temp->father->father==NULL) break;
						else temp = temp->father->father;
						p = p->father;
					}
					if(!isTree) break;
					
					//只要没有圈,就一定是树了
					//下面查找这个节点是否有到根节点的一条路径
					temp = t->father;
					bool findpath = false;
					while(temp != NULL) { 
						if(temp == root ) { findpath = true; break;}
						temp = temp->father;
					}
					if(! findpath) isTree = false;
				}

				if(isTree)
					cout<<"Case "<<num<<" is a tree."<<endl;
				else cout<<"Case "<<num<<" is not a tree."<<endl; 
			}
			// root 的个数不为1
			else cout<<"Case "<<num<<" is not a tree."<<endl;
		}
		//print(head);
		delete head;
		head = NULL;
	}
}

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