领接表存储图(用数组模拟领接表)

 1 import java.util.Scanner;
 2 import java.util.LinkedList;
 3 import java.util.LinkedList;
 4 import java.util.Scanner;
 5 import java.util.TreeSet;
 6 import java.util.Scanner;
 7 
 8 public class One {
 9     public static void main(String args[]) {
10         int n, m;
11         Scanner scanner = new Scanner(System.in);
12         System.out.println("请输入顶点数和边数");
13         n = scanner.nextInt();
14         m = scanner.nextInt();
15         B a[] = new B[m+1];//存放各条边的两个顶点及它们的权值
16         int first[]=new int[n+1];//first[i]存放顶点i的第一条边的编号
17         int next[]=new int[m+1];//next[m]存放编号为m的边的下一条边的编号
18         //领接表建立(数组模拟),领接表是从表头插入的,倒序遍历
19         System.out.println("各条边:");
20         for(int i=1;i<=m;i++){
21             a[i]=new B(scanner.nextInt(),scanner.nextInt(),scanner.nextInt());
22             next[i]=first[a[i].u];
23             first[a[i].u]=i;//存放点a[i].u的第一条边(倒序)的序号
24             
25         }
26         //领接表遍历(按照点的顺序)
27         System.out.println("遍历结果:");
28         for(int i=1;i<=n;i++){//遍历n个顶点出发的边
29             int k=first[i],j=0;//令k等于i点的第一条边
30             while(k!=0){//
31             System.out.println(a[k].u+" "+a[k].v+" "+a[k].w);    
32             k=next[k];
33             }
34         }
35     }
36 }
37 
38 class B {//存放一条边的信息(边的起点、末点、权值)
39     int u, v, w;
40 
41     B(int u, int v, int w) {
42         this.u = u;
43         this.v = v;
44         this.w = w;
45     }
46 }
领接表存储图

结果:

领接表存储图理解图解:

原文地址:https://www.cnblogs.com/qinmeizhen/p/6832691.html