毗邻表的根本概念
- 极点(Vertex):
- 图中的每个极点用一个节点表示。
- 每个极点存储一个链表或数组,用于记载与该极点直接相连的其他极点。
- 边(Edge):
- 如果极点 A 和极点 B 之间有一条边,那么在 A 的毗邻表中会记载 B,同时在 B 的毗邻表中也会记载 A(如果是无向图)。
- 存储方式:
- 毗邻表可以用多种方式实现,比如:
- 链表:每个极点对应一个链表,链表中存储与该极点相连的其他极点。
- 动态数组:每个极点对应一个动态数组(如 ArrayList),数组中存储与该极点相连的其他极点。
- 哈希表:每个极点对应一个哈希表,键是相邻极点,值可以是边的权重(适用于带权图)。
- 代码实现
极点界说
- public class Node {
- //节点位置
- int data;
- //下一个节点
- Node nextNode;
- //节点默认空值
- Node() {
- }
- ;
- //节点变量
- Node(int val)
- {
- data=val;
- }
- //节点初始化
- Node(int val,Node node)
- {
- data=val;
- nextNode=node;
- }
- }
复制代码 毗邻表创建与打印
- import java.util.ArrayList;
- import java.util.List;
- public class GraphTest {
- //创建领接表
- //顶点 A B C D E F
- //边 AB AC BD DF EF
- public static void creatGraph()
- {
- //创建顶点
- List<Character> vList=new ArrayList<>();
- for(int i=0;i<6;i++)
- {
- vList.add((char)('A'+i));
- }
- //创建空列表存储空节点,表示相互领接关系
- List<Node> vNodeList=new ArrayList<>();
- for(int i=0;i<vList.size();i++)
- {
- vNodeList.add(null);
- }
- //插入领接关系
- //A->B 0-1
- insert(0,1,vNodeList);
- //A->C 0-2
- insert(0,2,vNodeList);
- //B->D 1-3
- insert(1,3,vNodeList);
- //D->F 3-5
- insert(3,5,vNodeList);
- //E->F 4-5
- insert(4,5,vNodeList);
- //领接表打印
- for(int i=0;i<vNodeList.size();i++)
- {
- System.out.print(vList.get(i));
- System.out.print("-->");
- Node curNode=vNodeList.get(i);
- while (curNode!=null)
- {
- System.out.print(vList.get(curNode.data));
- System.out.print(" ");
- System.out.print(curNode.data);
- System.out.print(" ");
- curNode=curNode.nextNode;
- }
- System.out.println();
- }
- }
- //头插入法插入相互领接数据
- //v1为顶点位置,v2为相互领接顶点的位置
- public static void insert(int v1,int v2,List<Node> list){
- //创建一个节点
- Node newNode=new Node(v2);
- //新的节点指向列表里的节点
- newNode.nextNode=list.get(v1);
- //存储当前节点在列表里
- list.set(v1,newNode);
- }
- public static void main(String[] args) {
- creatGraph();
- }
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |