博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Graph Valid Tree -- LeetCode
阅读量:4339 次
发布时间:2019-06-07

本文共 1592 字,大约阅读时间需要 5 分钟。

Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), write a function to check whether these edges make up a valid tree.

For example:

Given n = 5 and edges = [[0, 1], [0, 2], [0, 3], [1, 4]], return true.

Given n = 5 and edges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]], return false.

思路:union find。

是一个树的条件有两个:无环,边数等于节点数减一。

检测无环可以用union find:枚举所有的边,检测并更新他们端点所属的集合。一开始所有的节点都属于各自的集合,然后merge每个边两端点所在的集合。因为树中的点都是连在一起的,最后肯定会在一个集合。注意的是,如果有一条边,一旦将它添加到树中后就会构成一个环,那么这条边的两个端点一定之前已经被添加进了树中(两个点属于同一个集合),否则,每条新加的边,至少有一个端点是之前不存在于这棵树中的(两个点属于不同的集合)。

1 class Solution { 2 public: 3     int find(vector
&parent, int x) { 4 if (parent[x] == x) return x; 5 int pa = find(parent, parent[x]); 6 parent[parent[x]] = pa; 7 return pa; 8 } 9 void merge(vector
&parent, int x, int y) {10 int parentX = find(parent, x);11 int parentY = find(parent, y);12 if (parentX != parentY)13 parent[parentY] = parentX;14 }15 bool validTree(int n, vector
>& edges) {16 vector
parent(n, 0);17 for (int i = 0; i < n; i++) parent[i] = i;18 for (int i = 0; i < edges.size(); i++) {19 if (find(parent, edges[i].first) == find(parent, edges[i].second))20 return false;21 merge(parent, edges[i].first, edges[i].second);22 }23 return n -1 == edges.size();24 }25 };

 

转载于:https://www.cnblogs.com/fenshen371/p/5817496.html

你可能感兴趣的文章
HDU 1242 Rescue BFS+优先队列
查看>>
主席树 静态区间第k大
查看>>
linux下查找文件和文件内容
查看>>
Flask-SQLAlchemy
查看>>
linux7.5 防火墙命令
查看>>
单链表
查看>>
洛谷P3182 [HAOI2016]放棋子
查看>>
modern.IE – 微软发布的 IE 兼容性测试工具和资源
查看>>
35个立体动感的视差滚动效果网站作品
查看>>
第二次试验报告
查看>>
数据库的四大特性以及事务的隔离级别
查看>>
Web版RSS阅读器(五)——初步完成阅读功能
查看>>
paip.提升性能---- 网站并发数的总结.txt
查看>>
PAT甲级——1131 Subway Map (30 分)
查看>>
wamp 修改www目录
查看>>
【原】Coursera—Andrew Ng机器学习—Week 10 习题—大规模机器学习
查看>>
【原】Coursera—Andrew Ng机器学习—Week 8 习题—聚类 和 降维
查看>>
(转)App工程结构搭建:几种常见Android代码架构分析
查看>>
java基础要点
查看>>
设计模式
查看>>