OJ_这是一颗树吗

2024-03-16 06:04
文章标签 oj 这是 一颗

本文主要是介绍OJ_这是一颗树吗,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题干

在这里插入图片描述
在这里插入图片描述

C++实现

树结构需要满足的三个条件

  • 不存在入度大于2的结点
  • 已连通的u,v,再加入一条新边就会成环
  • 边数 = 顶点数-1
#include <iostream>
#include <vector>
using namespace std;//并查集的应用:判断图的连通性int set[10001];
//i下标是集合数据编号,set[i]是i的父亲的编号
//若i是根,可令set[i] = i
void InitDisjointSet(int n) {for(int i = 0; i<n; ++i) {set[i] = i;}
}int FindDisjointSet(int u) {if(u == set[u]) {return u;} else {set[u] = FindDisjointSet(set[u]);//压缩路径return set[u];}
}int UnionDisjointSet(int u,int v) {int uRoot = FindDisjointSet(u);int vRoot = FindDisjointSet(v);//把v并到u上set[vRoot] = uRoot;
}int main() {int u,v;InitDisjointSet(10001);int edgeCount = 0;int vertexCount = 0;//vertex[i] = 0说明i未出现过vector<int> vertex(10001);//inDegree[i]记录i的入度vector<int> inDegree(10001);//判断是否是棵树bool isOK = true;int caseIndex = 1;while(1) {scanf("%d%d",&u,&v);if(u == -1&&v==-1) {break;} else if(u == 0 && v==0) {//一个图的所有边已经记录完成了if(vertexCount!=edgeCount+1) {isOK =false;//有特例:空树}if(vertexCount == 0 &&edgeCount ==0) {isOK = true;}if(isOK) {printf("Case %d is a tree.\n",caseIndex);} else {printf("Case %d is not a tree.\n",caseIndex);}InitDisjointSet(10001);edgeCount = 0;vertexCount = 0;for(int i = 0; i<10001; ++i) {vertex[i] = 0;inDegree[i] = 0;}isOK = true;++caseIndex;} else {//往当前图加入新边++edgeCount;if(vertex[u] == 0) {vertex[u] = 1;++vertexCount;}if(vertex[v] == 0) {vertex[v] = 1;++vertexCount;}if(FindDisjointSet(u) == FindDisjointSet(v)) {//说明成环了isOK = false;} else {UnionDisjointSet(u,v);}}++inDegree[v];if(inDegree[v]>=2) {isOK = false;}}
}

这篇关于OJ_这是一颗树吗的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/814529

相关文章

哈理工OJ 2179(深搜)

组合 Time Limit: 1000 MSMemory Limit: 32768 K Total Submit: 7(5 users)Total Accepted: 6(5 users)Rating: Special Judge: No Description 给出一个正整数N,从集合{1,2,3..N} 中找出所有大小为k的子集, 并按照字典序从小到大输出。 Input 第一行是一个整

每日OJ_牛客_求和(递归深搜)

目录 牛客_求和(递归深搜) 解析代码 牛客_求和(递归深搜) 求和_好未来笔试题_牛客网 解析代码         递归中每次累加一个新的数,如果累加和大于等于目标,结束递归。此时如果累加和正好等于目标,则打印组合。向上回退搜索其它组合。此题本身就是一个搜索的过程,找到所有的组合。 #include <iostream>#include <cmath>#in

心觉:如何用一颗心改变世界和自己

关于如何开发自己的潜意识开发的底层逻辑和注意事项 我这里就不赘述了,可以看我前面的文章 今天主要讲一下,如何让我们祈祷的作用发挥到极致 这里提到了祈祷,其实就是正念 把自己的梦想,目标,愿望通过积极的语言 或者生动形象的画面告诉自己的潜意识 你的这些梦想,目标,愿望就会慢慢地变成现实 这是真的,有无数的案例可以证实 我这里就不举例子了,大家可以网上搜 我只讲一下,为什么有些人

OJ-0905

题目 示例1: 输入:10 10 56 34 99 1 87 8 99 3 255 6 99 5 255 4 99 7 255 2 99 9 255 213 4输出:99 示例2: 输入:10 10 255 34 0 1 255 8 0 3 255 6 0 5 255 4 0 7 255 2 0 9 255 213 5输出:255 import java.util.

每日OJ_牛客_Emacs计算器(逆波兰表达式)

目录 牛客_Emacs计算器(逆波兰表达式) 解析代码 牛客_Emacs计算器(逆波兰表达式) Emacs计算器__牛客网 解析代码 逆波兰表达式(后缀表达式)求值,需要借助栈,思路: 循环输入,获取逆波兰表达式,然后进行以下补助,直到测试完所有的测试用例: 遇到数字字符串,将该数字字符串转化为数字然后入栈。遇到操作符时,从栈顶取两个数字,然后进行该运算符所对应运算

西北工业大学oj题-兔子生崽

题目描述: 兔子生崽问题。假设一对小兔的成熟期是一个月,即一个月可长成成兔,每对成兔每个月可以生一对小兔,一对新生的小兔从第二个月起就开始生兔子,试问从一对兔子开始繁殖,一年以后可有多少对兔子? 这道题目一眼看过去就是典型的递归问题,代码如下 public class RabbitReproduction {public static void main(String[] args) {in

★ 算法OJ题 ★ 力扣209 - 长度最小的子数组

Ciallo~(∠・ω< )⌒☆ ~ 今天,简将和大家一起做一道滑动窗口算法题--长度最小的子数组~ 目录 一  题目 二  算法解析 解法⼀:暴力求解 解法二:滑动窗口 三  编写算法 一  题目 209. 长度最小的子数组 - 力扣(LeetCode) 二  算法解析 解法⼀:暴力求解 算法思路: 从前往后枚举数组中的任意⼀个元素,把它当成起始位置

OJ-0903

题目 示例1 输入:30 12 25 8 19输出:15 示例2 输入:10 12 25 8 19 8 6 4 17 19 20 30输出:-1 题解 import java.util.ArrayList;import java.util.List;import java.util.Scanner;public class Main {public static

判断一颗二叉树是否为完全二叉树

一:前提 是在此篇博客的基础上进行的:用队列实现二叉树的层序遍历-CSDN博客  二:思路 1:完全二叉树和非完全二叉树的区别在于->非空节点是连续的,就是完全二叉树、非空节点是不连续的,就不是完全二叉树。意思就是,完全二叉树不可能在节点中穿插一个NULL节点。 2:所以当我们队列中出到NULL节点的时候,此时队列中剩下的节点,应该全都是NULL,不可能有一个非空,但凡有一个非空,那一定不

【负载均衡式在线OJ】Compile_server 模块

文章目录 程序源码compile_server整体思路编译(compile.hpp)运行模块编译运行模块编译运行服务 程序源码 https://gitee.com/not-a-stupid-child/online-judge compile_server 整体思路 这个服务要对oj_server 发送过来的代码进行编译和运行,最后把结果返回给oj_server。 所以我