找出无向图汇总的相连要素find-the-connected-component-in-the-undirected-graph

请找出无向图中相连要素的个数。

图中的每个节点包含其邻居的 1 个标签和 1 个列表。(一个无向图的相连节点(或节点)是一个子图,其中任意两个顶点通过路径相连,且不与超级图中的其它顶点相连。)

样例

给定图:

A------B  C
 \     |  |
  \    |  |
   \   |  |
    \  |  |
      D   E

返回 {A,B,D}, {C,E}。其中有 2 个相连的元素,即{A,B,D}, {C,E}

思路:说实话,lintcode的翻译我并没有看懂是啥意思,当然更不知道怎么做。准确的说,这个问题应该叫做在无向图中找各极大连通子图,使用的算法是广度优先搜索。此处附上广度优先搜索和深度优先搜索算法的比较,顺带复习一下;

http://blog.csdn.net/andyelvis/article/details/1728378

当然代码也是我学习他人的,来源附上http://www.jiuzhang.com/solutions/find-the-connected-component-in-the-undirected-graph/

 1 /**
 2  * Definition for Undirected graph.
 3  * class UndirectedGraphNode {
 4  *     int label;
 5  *     ArrayList<UndirectedGraphNode> neighbors;
 6  *     UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); }
 7  * };
 8  */
 9 public class Solution {
10     /**
11      * @param nodes a array of Undirected graph node
12      * @return a connected set of a Undirected graph
13      */
14     public List<List<Integer>> connectedSet(ArrayList<UndirectedGraphNode> nodes) {
15         // Write your code here
16         int m = nodes.size();
17         Map<UndirectedGraphNode,Boolean> visited = new HashMap<>();
18         for(UndirectedGraphNode node:nodes){
19             visited.put(node,false);
20         }
21         List<List<Integer>> result = new ArrayList<>();
22         for(UndirectedGraphNode node:nodes){
23             if(visited.get(node) == false){
24                 bfs(node,visited,result);
25             }
26         }
27         return result;
28     }
29     public void bfs(UndirectedGraphNode node,Map<UndirectedGraphNode,Boolean> visited,List<List<Integer>> result){
30         List<Integer> row = new ArrayList<>();
31         Queue<UndirectedGraphNode> queue = new LinkedList<>();
32         visited.put(node,true);
33         queue.offer(node);
34         while(!queue.isEmpty()){
35             UndirectedGraphNode u = queue.poll();
36             row.add(u.label);
37             for(UndirectedGraphNode v:u.neighbors){
38                 if(visited.get(v)==false){
39                     visited.put(v,true);
40                     queue.offer(v);
41                 }
42             }
43         }
44         Collections.sort(row);
45         result.add(row);
46     }
47 }
时间: 2024-10-11 05:41:53

找出无向图汇总的相连要素find-the-connected-component-in-the-undirected-graph的相关文章

lintcode 容易题:Find the Connected Component in the Undirected Graph 找出无向图汇总的相连要素

题目: 找出无向图汇总的相连要素 请找出无向图中相连要素的个数. 图中的每个节点包含其邻居的 1 个标签和 1 个列表.(一个无向图的相连节点(或节点)是一个子图,其中任意两个顶点通过路径相连,且不与超级图中的其它顶点相连.) 样例 给定图: A------B C \ | | \ | | \ | | \ | | D E 返回 {A,B,D}, {C,E}.其中有 2 个相连的元素,即{A,B,D}, {C,E} 解题: 广度优先+递归,写不出来,程序来源 Java程序: /** * Defini

[Swift]LeetCode323. 无向图中的连通区域的个数 $ Number of Connected Components in an Undirected Graph

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 find the number of connected components in an undirected graph. Example 1: 0          3 |          | 1 --- 2    4 Given n = 5 and

310. Minimum Height Trees -- 找出无向图中以哪些节点为根,树的深度最小

For a undirected graph with tree characteristics, we can choose any node as the root. The result graph is then a rooted tree. Among all possible rooted trees, those with minimum height are called minimum height trees (MHTs). Given such a graph, write

hdu Caocao&#39;s Bridges(无向图边双连通分量,找出权值最小的桥)

1 /* 2 题意:给出一个无向图,去掉一条权值最小边,使这个无向图不再连同! 3 4 tm太坑了... 5 1,如果这个无向图开始就是一个非连通图,直接输出0 6 2,重边(两个节点存在多条边, 权值不一样) 7 3,如果找到了桥的最小权值为0,也就是桥上的士兵数为0,那么还是要最少派一个 8 士兵过去炸掉桥! 9 10 思路:假设每两个节点最多只有一条边进行相连! 11 进行tarjan算法,如果该算法调用了超过2次,说明这个原图就是不连通的! 12 否则在tarjan算法中将桥存起来!然后

C语言:对传入sp的字符进行统计,三组两个相连字母“ea”&quot;ou&quot;&quot;iu&quot;出现的次数,并将统计结果存入ct所指的数组中。-在数组中找出最小值,并与第一个元素交换位置。

//对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中. 1 #include <stdio.h> 2 #include <string.h> 3 #pragma warning (disable:4996) 4 void fun(char*sp ,int *ct) 5 { 6 int a=0, b=0, c=0; 7 while (*sp != '\0') 8 { 9 if (*s

c语言代码编程题汇总:找出字符串中与输入的字母元素相同的个数以及其所对应数组的下标值

找出字符串中与输入的字母元素相同的个数以及其所对应数组的下标值 程序代码如下: 1 /* 2 2017年3月8日08:39:16 3 功能:找出字符串中与输入的字母元素相同的个数以及其所对应数组的下标值 4 */ 5 6 #include"stdio.h" 7 int main (void) 8 { 9 int i = 0, j = 0; 10 char a[100]; 11 char ch; 12 int num = 0; 13 14 printf ("please inp

c语言代码编程题汇总:找出三个数据中最大的数值

找出三个数据中最大的数值 程序代码如下: 1 /* 2 2017年3月9日12:04:37 3 功能:找出三个数据中最大的数值 4 */ 5 #include"stdio.h" 6 7 int fun(int,int,int); 8 9 int main() 10 { 11 int a ,b,c; 12 13 printf("please input three number: \n"); 14 15 scanf("%d %d %d",&

Loadrunner11点击录制脚本无响应,IE页面弹不出——解决方案汇总

以前用Loadrunner的时候都没有遇到过这个问题,后来将服务器重装系统(win7)后,重新安装Loadrunner11,浏览器版本刚开始为IE11,后来降为IE8,IE访问部署在虚拟机里的平台能正常访问,但是用LR录制脚本时,点击录制脚本按钮之后,IE页面没有自动弹出,上网查找解决方案,本着死马当活马医的心态把查到的每一种方法都试了一下,最后IE页面弹出的那一瞬差点喊出来\(≧▽≦)/,现在把我的解决步骤作了总结. 录制环境:win7  64位操作系统  IE11(后卸载成IE8)   LR

给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列

问题 给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列.规则如下: 一次只能改变一个字母 中间单词必须在字典里存在 例如: 给出 start = "hit"end = "cog"dict = ["hot","dot","dog","lot","log"] 返回 [ ["hit","hot",&