算法-数据布局-图-毗邻表构建

打印 上一主题 下一主题

主题 887|帖子 887|积分 2661

毗邻表的根本概念


  • 极点(Vertex)

    • 图中的每个极点用一个节点表示。
    • 每个极点存储一个链表或数组,用于记载与该极点直接相连的其他极点。

  • 边(Edge)

    • 如果极点 A 和极点 B 之间有一条边,那么在 A 的毗邻表中会记载 B,同时在 B 的毗邻表中也会记载 A(如果是无向图)。

  • 存储方式

    • 毗邻表可以用多种方式实现,比如:

      • 链表:每个极点对应一个链表,链表中存储与该极点相连的其他极点。
      • 动态数组:每个极点对应一个动态数组(如 ArrayList),数组中存储与该极点相连的其他极点。
      • 哈希表:每个极点对应一个哈希表,键是相邻极点,值可以是边的权重(适用于带权图)。


  • 代码实现
极点界说
  1. public class Node {
  2.     //节点位置
  3.     int data;
  4.     //下一个节点
  5.     Node nextNode;
  6.     //节点默认空值
  7.     Node() {
  8.     }
  9.     ;
  10.     //节点变量
  11.     Node(int val)
  12.     {
  13.         data=val;
  14.     }
  15.     //节点初始化
  16.     Node(int val,Node node)
  17.     {
  18.         data=val;
  19.         nextNode=node;
  20.     }
  21. }
复制代码
毗邻表创建与打印
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class GraphTest {
  4.     //创建领接表
  5.     //顶点 A B C D E F
  6.     //边 AB AC BD DF EF
  7.     public static void creatGraph()
  8.     {
  9.         //创建顶点
  10.         List<Character> vList=new ArrayList<>();
  11.         for(int i=0;i<6;i++)
  12.         {
  13.             vList.add((char)('A'+i));
  14.         }
  15.         //创建空列表存储空节点,表示相互领接关系
  16.         List<Node> vNodeList=new ArrayList<>();
  17.         for(int i=0;i<vList.size();i++)
  18.         {
  19.             vNodeList.add(null);
  20.         }
  21.         //插入领接关系
  22.         //A->B 0-1
  23.         insert(0,1,vNodeList);
  24.         //A->C 0-2
  25.         insert(0,2,vNodeList);
  26.         //B->D 1-3
  27.         insert(1,3,vNodeList);
  28.         //D->F 3-5
  29.         insert(3,5,vNodeList);
  30.         //E->F 4-5
  31.         insert(4,5,vNodeList);
  32.         //领接表打印
  33.         for(int i=0;i<vNodeList.size();i++)
  34.         {
  35.             System.out.print(vList.get(i));
  36.             System.out.print("-->");
  37.             Node curNode=vNodeList.get(i);
  38.             while (curNode!=null)
  39.                 {
  40.                     System.out.print(vList.get(curNode.data));
  41.                     System.out.print(" ");
  42.                     System.out.print(curNode.data);
  43.                     System.out.print(" ");
  44.                     curNode=curNode.nextNode;
  45.                 }
  46.             System.out.println();
  47.         }
  48.     }
  49.     //头插入法插入相互领接数据
  50.     //v1为顶点位置,v2为相互领接顶点的位置
  51.     public static void insert(int v1,int v2,List<Node> list){
  52.         //创建一个节点
  53.         Node newNode=new Node(v2);
  54.         //新的节点指向列表里的节点
  55.         newNode.nextNode=list.get(v1);
  56.         //存储当前节点在列表里
  57.         list.set(v1,newNode);
  58.     }
  59.     public static void main(String[] args) {
  60.         creatGraph();
  61.     }
  62. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

杀鸡焉用牛刀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表