178-图是否是树

给出 n 个节点,标号分别从 0 到 n - 1 并且给出一个 无向 边的列表 (给出每条边的两个顶点), 写一个函数去判断这张`无向`图是否是一棵树

注意事项

你可以假设我们不会给出重复的边在边的列表当中. 无向边 [0, 1] 和 [1, 0] 是同一条边, 因此他们不会同时出现在我们给你的边的列表当中。

样例

给出n = 5 并且 edges = [[0, 1], [0, 2], [0, 3], [1, 4]], 返回 true.

给出n = 5 并且 edges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]], 返回 false.

标签

Union Find 深度优先搜索 宽度优先搜索 脸书 谷歌 Zenefits

思路

若图是一棵树,需满足以下条件 参考http://blog.csdn.net/waltonhuang/article/details/52103401

  • 边的个数 = 点的个数 - 1
  • 不存在回路(dfs过程中如果碰到访问过的节点(当然这个节点不能是来时的节点),就是有回路)
  • 不存在孤立节点

code

class Solution {
public:
/**
* @param n an integer
* @param edges a list of undirected edges
* @return true if it's a valid tree, or false
*/
bool validTree(int n, vector<vector<int>>& edges) {
// Write your code here
int size = edges.size(), i = 0;
// 如果图中边的个数不等于点的个数n-1,必然不为树
if (n - size != 1) {
return false;
}
// 由 edges 得邻接表
vector<vector<int>> neighbor(n);
for (i = 0; i < size; i++) {
int start = edges[i][0], end = edges[i][1];
neighbor[start].push_back(end);
neighbor[end].push_back(start);
}
// 检测是否有回路
vector<bool> visited(n, false);
if (hasCycle(neighbor, visited, -1, 0)) {
return false;
}
// 检测是否有孤立节点
for (i = 0; i < n; i++) {
if (visited[i] == false) {
return false;
}
}
return true;
} bool hasCycle(vector<vector<int>> &neighbor, vector<bool> &visited, int par, int kid) {
if (visited[kid] == true) {
return true;
}
visited[kid] = true;
for (int i = 0; i < neighbor[kid].size(); i++) {
// 先排除 par == neighbor[kid][i] 的情况,这种情况其实是neighbor数组定义的时候固有的特性,不算成环
if (par != neighbor[kid][i] && hasCycle(neighbor, visited, kid, neighbor[kid][i])) {
return true;
}
}
return false;
}
};

最新文章

  1. 对jquery的ajax进行二次封装
  2. Grasshopper 2.0 MP Color FireWire 1394b (Sony ICX274)
  3. HTTP协议(转自:小坦克博客)
  4. alpha预乘
  5. SQL效率问题
  6. SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
  7. BZOJ1533: [POI2005]Lot-A Journey to Mars
  8. WPF4.5新特性(MSDN的翻译读不太懂)
  9. Java虚拟机中的内存分配
  10. 如何在 ASP.NET Core 中发送邮件
  11. android studio 2.32躺坑记
  12. 078、Docker 最常用的监控方案(2019-04-25 周四)
  13. unity中编辑器直接截屏代码
  14. 突破拐点:企业成长的S曲线
  15. rman 脚本大全
  16. CCF计算机网络会议日期
  17. AM二次开发中选择指定范围内的对象
  18. 一个简单的SignalR例子
  19. CAScrollLayer
  20. 2018.09.22 ZJOI2005午餐(贪心+01背包)

热门文章

  1. Python入门 —— 04字符串解析
  2. QQ好友的价值玩法 及如何搞到几万好友?
  3. ACM1002:A + B Problem II
  4. ACM数据结构-并查集
  5. BINARYSEARCH有り無しのパフォーマンスの違い
  6. 汇编指令lodsb和stosb、lodsd和stosd
  7. ECMAScript 5 compatibility shims for legacy JavaScript engines
  8. 长沙Uber优步司机奖励政策(1月4日~1月10日)
  9. underscore.js 分析 第二天
  10. IAR调试cc2541串口遇到的Warning : Possible IDATA stack overflow detected