无向图:
一些关于图的定义:
图是由一组顶点和一组能够将两个顶点相连的边组成。
连通图:如果从任意一个顶点都存在一条路径到达另一个任意顶点,就称为连通图,一个非连通图由若干连通的部分组成,都称为极大连通子图。
无向图:即连接两个顶点的边是没有方向的。
无向图的数据结构:
使用邻接表来表示图:
如上图所示,使用一个链表数组来表示图,其中数组的索引表示所有的顶点,每个数组中存放的链表表示所有与此顶点相连的顶点,也可以理解为边。
数据结构如下:
先看链表:
public class LinkedList<T> { private Integer N = 0; private Node<T> root; //链表的结点 @SuppressWarnings("hiding") class Node<T> { T value; Node<T> next; public Node(T t,Node<T> node) { this.value = t; this.next = node; } } //添加一个结点 public void add(Node<T> node) { if(root == null) root = node; else { Node<T> temp = root; root = node; root.next = temp; } N++; } public void add(T t) { Node<T> node = new Node<T>(t,null); if(root == null) root = node; else { Node<T> temp = root; root = node; root.next = temp; } N++; } //链表的节点数 public Integer size() { return N; } public Node<T> getRoot() { return root; } //遍历链表 public void traverse() { Node<T> node = root; while(node != null) { System.out.print(node.value + " "); node = node.next; } } //获取链表上的所有节点的值,返回一个数组 public Integer[] getAllValue(LinkedList<T> linkedList) { if(linkedList.root == null) return null; Integer[] result = new Integer[linkedList.size()]; Node<T> node = linkedList.root; Integer i = 0; while(node != null) { result[i++] = (Integer)node.value; node = node.next; } return result; } }
图的