图的基本结构

概念:

(1)图是由顶点集合以及顶点间的关系集合组成的一种数据结构。

Graph = (V,E) V是顶点的有穷非空集合;E是顶点之间关系的有穷集合,也叫边集合。

(2)有向图:顶点对<x,y>是有序的;无向图:顶点对<x,y>是无序的。

(3)无向边:若顶点Vi到Vj之间的边没有方向,则称这条边为无向边,用无序偶对(Vi,Vj)来表示。

(4)完全无向图:若有n个顶点的无向图有n(n-1)/2 条边, 则此图为完全无向图。

完全有向图:有n个顶点的有向图有n(n-1)条边, 则此图为完全有向图。

(5)树中根节点到任意节点的路径是唯一的,但是图中顶点与顶点之间的路径却不是唯一的。

路径的长度是路径上的边或弧的数目。

(6)如果对于图中任意两个顶点都是连通的,则成G是连通图。

(7)图按照边或弧的多少分稀疏图和稠密图。 如果任意两个顶点之间都存在边叫完全图,有向的叫有向图。

若无重复的边或顶点到自身的边则叫简单图。

(8)图中顶点之间有邻接点。无向图顶点的边数叫做度。有向图顶点分为入度和出度。

(9)图上的边和弧上带权则称为网。

(10)有向的连通图称为强连通图。

结构实现代码:

点:

public class Node {
        //节点值
    public int value;
        //入度
    public int in;
        //出度
    public int out;
        //当前结点所连通的所有节点
    public ArrayList<Node> nexts;
        //当前结点所有连通的边
    public ArrayList<Edge> edges;

    public Node(int value) {
        this.value = value;
        in = 0;
        out = 0;
        nexts = new ArrayList<>();
        edges = new ArrayList<>();
    }
}


边:

public class Edge {
        //权重
    public int weight;
    public Node from;
    public Node to;

    public Edge(int weight, Node from, Node to) {
        this.weight = weight;
        this.from = from;
        this.to = to;
    }


图:

public class Graph {
        //存储点集,Integer标识用
    public HashMap<Integer,Node> nodes;
    public HashSet<Edge> edges;

    public Graph() {
        nodes = new HashMap<>();
        edges = new HashSet<>();
    }
}


建立图:

思路:

建立一个图,题目通常会给你一个二维数组,例如如下这种,第一个元素表示from,第二个表示to,第三个元素表示权重

[1,2,50]
[2,3,100]
[4,3,40]

给定这个二维数组后,让你建立图
循环数组的第一维,如果图中没有from to 等就加入,然后加入边,入度出度等信息,就可以建立出一个图

代码:
public static Graph createGraph(Integer[][] matrix) {
        Graph graph = new Graph();
        for (int i = 0; i < matrix.length; i++) {
            Integer from = matrix[i][0];
            Integer to = matrix[i][1];
            Integer weight = matrix[i][2];
            if (!graph.nodes.containsKey(from)) {
                graph.nodes.put(from, new Node(from));
            }
            if (!graph.nodes.containsKey(to)) {
                graph.nodes.put(to, new Node(to));
            }
            Node fromNode = graph.nodes.get(from);
            Node toNode = graph.nodes.get(to); 
            Edge newEdge = new Edge(weight, fromNode, toNode);
            fromNode.nexts.add(toNode);
            fromNode.out++;
            toNode.in++;
            fromNode.edges.add(newEdge);
            graph.edges.add(newEdge);
        }
        return graph;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第一章 绪论 什么是数据结构? 数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 第二章...
    SeanCheney阅读 5,822评论 0 19
  • https://zh.visualgo.net/graphds 浅谈图形结构https://zh.visualgo...
    狼之独步阅读 4,236评论 0 0
  • 图是一种比线性表和树更复杂的数据结构,在图中,结点之间的关系是任意的,任意两个数据元素之间都可能相关。图是一种多对...
    Alent阅读 2,347评论 1 22
  • 图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合...
    开心糖果的夏天阅读 888评论 0 9
  • 想我冷艳还想我轻佻又下贱,要我阳光还要我风情不摇晃。 为我撩人还为我双眸失神,图我情真还图我眼波销魂。 夸我含苞待...
    月色溶溶阅读 418评论 4 8