题解 | #Is It A Tree?#

Is It A Tree?

https://www.nowcoder.com/practice/1c5fd2e69e534cdcaba17083a5c56335

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

#define N 10000  //元素的上限个数
int father[N]; //存储了每个元素父亲的下标
bool visited[N] = { false };

int input[N] = { 0 }; //用于记录结点的入度

void Init() {
	for (int i = 0; i < N; i++) {
		father[i] = i;
		input[i] = 0;
		visited[i] = false;
	}
}

int Findfather(int x) {
	if (x != father[x]) {
		father[x] = Findfather(father[x]);
	}
	return father[x];
}

void Union(int x, int y) {
	x = Findfather(x);
	y = Findfather(y);
	if (x != y) {
		father[y] = x;
	
	}
	
}

bool IsTree() {
	int num = 0, root = 0; //连通分量的数目,根节点的数目
	for (int i = 1; i <= N; i++) {
		if (!visited[i]) continue;
		else {
			if (input[i] > 1) return false;

			if (father[i] == i) {
				num++;
			}
			if (input[i] == 0)
				root++;
		}

	}
    if(root ==0 &&num==0) return true;
    else if (root != 1 || num != 1)
		return false;

	return true;

}


int main() 
{
		Init();  //并查集初始化
		int n, m;
		int index = 1;
		while (cin >> n >> m) {
			if (n == -1 && m == -1) {
				break;
			}
			if (n == 0 && m == 0) {
				if (IsTree())
					cout << "Case " << index++ << " is a tree." << endl;
				else cout << "Case " << index++ << " is not a tree." << endl;
				Init();
				continue;
			}
			if (!visited[n]) visited[n] = true;
			if (!visited[m]) visited[m] = true;    //给每个访问到的结点做标记
			Union(n, m);
			input[m]++;
		}
}

全部评论

相关推荐

shtdbb_:还不错,没有让你做了笔试再挂你
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务