当前位置: 首页 > news >正文

佛山企业网站建设策划工商局加强网站建设的通知

佛山企业网站建设策划,工商局加强网站建设的通知,公司网站建设意见,国外企业网站案例判断一个图是不是树 问题描述 给一个以0 0结尾的整数对列表,除0 0外的每两个整数表示一条连接了这两个节点的边。假设节点编号不超过100000大于0。你只要判断由这些节点和边构成的图是不是树。是输出YES,不是输出NO。 输入样例1 6 8 5 3 5 2 6 4 5…

判断一个图是不是树

问题描述

给一个以0 0结尾的整数对列表,除0 0外的每两个整数表示一条连接了这两个节点的边。假设节点编号不超过100000大于0。你只要判断由这些节点和边构成的图是不是树。是输出YES,不是输出NO。

在这里插入图片描述

输入样例1

6 8  5 3  5 2  6 4 5 6  0 0

输出样例1

YES

输入样例2

8 1  7 3  6 2  8 9  7 5 7 4  7 8  7 6  0 0

输出样例2

YES

输入样例3

3 8  6 8  6 4 5 3  5 6  5 2  0 0

输出样例3

NO

输入样例4

1 2 3 4 0 0

输出样例4

NO

输入样例5

空树也是树

0 0

输出样例5

YES

c++代码

#include<bits/stdc++.h>
#include<stdio.h>using namespace std;int a, b, cont = 0;
int arr[100001];
bool key = true;
unordered_set<int> st;int myfind(int x) {int root = x;while(root != arr[root]) root = arr[root];int i = x, j;while(i != root) {j = arr[i];arr[i] = root;i = j;}return root;
}void mymerge(int x, int y) {x = myfind(x), y = myfind(y);if (x != y) arr[y] = arr[x];
}int main() {for (int i = 1; i <= 100000; i++) arr[i] = i;while(true) {scanf("%d %d", &a, &b);if (a == 0 && b == 0) {if (cont == 0) {printf("YES\n");return 0;}if (key && st.size() != cont + 1) key = false;if (key) {int root = -1;for (int x : st) {int k = myfind(x);if (root == -1) root = k;if (k != root) {key = false;break;}}}if (key) printf("YES\n");else printf("NO\n");break;}else {cont++;if (st.find(a) == st.end()) st.insert(a);if (st.find(b) == st.end()) st.insert(b);if (key) {int x = myfind(a), y = myfind(b);if (x == y) key = false;else mymerge(a, b);}}}return 0;
}

算法解析

满足下面三个条件的图是树

1、不存在环。

2、所有点都是互相连通的。

3、点数=边数 + 1。

判断环

用并查集,给每个点一个初始的编号,并初始化所有节点的父亲为本身。每新加入一条边就把边相连的两个集合合并到一起,如果边相连的集合原本就是同一个,说明已经成环,不是生成树。

int x = myfind(a), y = myfind(b);
if (x == y) key = false; //边相连的集合原本就是同一个,说明已经成环,不是生成树。
else mymerge(a, b); //否则合并一下

判断节点数和边数的关系

把点存在一个unordered_set里面就行,因为不能存重复的,边用一个cont就可以存

cont++;
if (st.find(a) == st.end()) st.insert(a);
if (st.find(b) == st.end()) st.insert(b);
......
if (key && st.size() != cont + 1) key = false;

判断连通性

如果是连通的,根据我们之前的合并操作,每一个节点应该都属于同一个集合,如果不是,则不是树。

int root = -1;
for (int x : st) {int k = myfind(x);if (root == -1) root = k;if (k != root) {key = false;break;}
}
http://www.dtcms.com/a/572241.html

相关文章:

  • 网络营销推广的主要形式为seo在线优化
  • 首钢建设网站免费网页在线代理服务
  • 景县住房和城乡规划建设局网站硬件开发流程图
  • 设计坞广州做网站优化
  • 长沙网站seo多少钱huntt wordpress主题
  • 文案网站策划书汕头市专注网站建设
  • asp做的网站如何更新淘宝客的网站是如何建设的
  • 韩城做网站服务器上怎么做网站
  • 西安建设教育网站wordpress适用于任何网站吗
  • 如何做网站的后台管理温州哪里做网站比较好
  • 企业门户网站模式企业宣传网
  • 一般ps做网站大小多少自己制作手机网站
  • 网站如何做线上支付功能网站排名下降
  • 注册网站会有哪些风险手机网站建设技术
  • 企业网站定制开发流程已有网站可以做服务器吗
  • 网站建设的好处和目的seo工具排行榜
  • 陕西住房建设厅考试官方网站郑州做网站服务器
  • 网站平台建设步骤企业公司建设网站
  • 京东商城网站域名怎么制作图片模板
  • 沧州网站设计报价大气腐蚀网站建设
  • 网站高端制作app软件需要用到哪些技术
  • 做网站应该了解什么移动端网站和微信网页设计
  • node.js做网站开发建平台网站
  • 在一个空间建两个网站漳州微信网站建设
  • 建网站用什么工具wordpress 修改自定义菜单
  • 山东做网站wordpress post slug codex
  • 免费培训学校网站源码wordpress兼容php版本
  • 当当网站开发系统说明网站后台策划
  • 潍坊淘宝网站建设集约化网站建设
  • 弄个盈利网站做什么海外如何淘宝网站建设