题解 | Is It A Tree?

Is It A Tree?

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

#include<iostream>
#include<cstring>
using namespace std;
const int N = 10010;
int p[N];
int id[N];//保存结点入度
int node_num, e_num;//记录结点数量以及边的数量
bool visit[N];//表明结点是否被访问过
bool not_true = false;
int find(int x) {
	//返回祖宗结点顺便加上路径压缩
	if (p[x] != x)p[x] = find(p[x]);
	return p[x];
}
void init() {
	for (int i = 0; i < 10010; i++) {
		p[i] = i;
	}
}
void Union(int x, int y) {
	//合并操作
	if (find(x) != find(y))p[find(x)] = find(y);//修改根结点的指向就是合并操作
}
int main() {
	//本题要积累起的知识点
	// 1.如何判断图是否是一颗树,每个结点的入度最大为1
	// 2.其次不能有环--得用并查集来判断是否有环
	//       判断是否有环的思路:若一个图已经联通的情况下,再不增加结点的情况下增加一条边就会形成环
	// 3.在以上两条条件都满足的情况下,得确保整个图是联通的,也就是要顶点数等于边的数量加1
	int x, y;
	int t = 0;//表明当前是第几个案例
	//并查集别忘了要先初始化
	init();

	//读入多组数据的题就是要注意在下一组数据开始前恢复原来的状态
	while (cin >> x >> y) {
		if (x == 0 && y == 0) {
			//先判断该情况是否是一个树
			t++;
			//注意空树也是个树,这种情况要特判
			if (node_num == 0 && e_num == 0) {
				printf("Case %d is a tree.\n", t);
				continue;
			}
			//刚刚没有.纠错了,这点要注意
			if (node_num == e_num + 1 && not_true == false)printf("Case %d is a tree.\n", t);
			else printf("Case %d is not a tree.\n", t);

			//插入结束清空恢复数据
			memset(visit, 0, sizeof visit);
			memset(id, 0, sizeof id);
			init();
			not_true = false;
			node_num = 0, e_num = 0;
			//此时0,0就不要再执行接下来从操作了
			continue;
		}
		if (x == -1 & y == -1)break;
		//这个要在插入边前判断
		if (find(x) == find(y)) {
			//如果这两个结点所在部分有相同的根结点,说明已经联通了
			//这时候再加入一条边肯定就会成环,不会形成树
			not_true = true;
		}
		Union(x, y);
		//别忘了还要计算入度
		if (id[y] == 0)id[y]++;
		else not_true = true;
		
		e_num++;
		if (!visit[x])visit[x]=true,node_num++;
		if (!visit[y])visit[y]=true,node_num++;
		
	}
	return 0;
}

全部评论

相关推荐

来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务