算法8-3:权重图接口

在正式编写最小生成树的算法之前,还需要做一些准备工作。具体的工作就是建立一些基础对象。

首先需要建立边的对象。现在的边要增加权重信息,一条边需要记录两个端点以及这条边的权重,因此边类的轮廓如下:

public class Edge implements Comparable<Edge> {
    public Edge(int v, int w, double weight) {
    }

    // 返回任意一个端点
    public int either() {
    }

    // 返回另外一个端点
    public int other(int v) {
    }

    // 和另外一条边比较权重
    @Override
    public int compareTo(Edge that) {
    }

    // 返回这条边的权重
    public double weight() {
    }

    @Override
    String toString();
}

接口知道以后,实现方面就非常方便了。

public class Edge implements Comparable<Edge> {
    private int v;
    private int w;
    private double weight;

    public Edge(int v, int w, double weight) {
        this.v = v;
        this.w = w;
        this.weight = weight;
    }

    // 返回任意一个端点
    public int either() {
        return v;
    }

    // 返回另外一个端点
    public int other(int v) {
        if (v == this.v) return w;
        else return this.v;
    }

    // 和另外一条边比较权重
    @Override
    public int compareTo(Edge that) {
        if (this.weight < that.weight) return -1;
        if (this.weight > that.weight) return 1;
        return 0;
    }

    // 返回这条边的权重
    public double weight() {
        return this.weight;
    }

    @Override
    public String toString() {
        return String.format("%s-%s %s", v, w, weight);
    }
}

权重图

下面为权重图建立一个类。它的接口是这样的:

public class EdgeWeightedGraph {
    public EdgeWeightedGraph(int V) {
    }

    // 在图中增加一条边
    public void addEdge(Edge e) {
    }

    // 获取与指定顶点相邻的边
    public Iterable<Edge> adj(int v) {
    }

    // 获取图中所有的边
    public Iterable<Edge> edges() {
    }

    // 获取该图中的顶点数量
    public int V() {
    }

    // 获取该图中的边数
    public int E() {
    }

    // 将图转换成字符串用于显示
    @Override
    public String toString() {
    }
}

这样设计接口的好处就是能够让图支持自连接以及并行连接。权重图的全部代码如下:

import java.util.LinkedList;
import java.util.List;

public class EdgeWeightedGraph {
    private int V;
    private List<Edge>[] adj;
    private List<Edge> allEdges;

    public EdgeWeightedGraph(int V) {
        this.V = V;
        allEdges = new LinkedList<Edge>();
        adj = new LinkedList[V];
        for (int i = 0; i < V; i++) {
            adj[i] = new LinkedList<Edge>();
        }
    }

    // 在图中增加一条边
    public void addEdge(Edge e) {
        int v = e.either();
        int w = e.other(v);
        adj[v].add(e);
        adj[w].add(e);
        allEdges.add(e);
    }

    // 获取与指定顶点相邻的边
    public Iterable<Edge> adj(int v) {
        return adj[v];
    }

    // 获取图中所有的边
    public Iterable<Edge> edges() {
        return allEdges;
    }

    // 获取该图中的顶点数量
    public int V() {
    }

    // 获取该图中的边数
    public int E() {
        return allEdges.size();
    }

    // 将图转换成字符串用于显示
    @Override
    public String toString() {
        String result = "";
        for(Edge e : edges()) {
            result += e.toString();
            result += "\n";
        }
        return result;
    }
}

最小生成树

最小生成树应该从一个权重图创建,而且它的边是权重图的子集,因此MST的接口应该是这样的:

public class MST {
    public MST(EdgeWeightedGraph G) {
    }

    // 返回最小生成树中所有的边
    public Iterable<Edge> edges() {
    }

    // 返回最小生成树中所有边的权重之和
    public double weight() {
    }
}

算法8-3:权重图接口

时间: 2024-08-24 21:22:40

算法8-3:权重图接口的相关文章

【算法与数据结构】图 -- 邻接表

/************************************************************************ 边(弧)结点 -------------------------- |adjvex | info | nextarc | -------------------------- adjvex:邻接点域,该点在图中的位置 info :相关信息,比如可以保存从某顶点到该点的权值 nextac:指向下一个与该点有相同邻接点的顶点 顶点结点 ---------

【算法与数据结构】图 -- 数组表示法

图的数组表示法 借助一个二维数组表示图,该二维数组的第i行,第j列的值表示从Node[i]到Node[j]: 无向图(网):是否有边 / 权值,arr[i][j] == arr[j][i],无向图(网)的特性,矩阵关于对角线对称. 有向图(网):是否有弧 / 权值. //图的数组表示法 //最大顶点个数 const int MAX_VERTEX = 100; //最大值 const int MAX_VALUE = (1 << 31) - 1; typedef struct _tagArcCel

【算法与数据结构】图 -- 十字链表

图的[十字链表]表示法是一种链式存储结构,可以看成是[邻接表]和[逆邻接表]的组合 本文中用到的有向图 /************************************************************************ 有向图的存储:十字链表 有向图的十字链表存储结构,是有一种链式存储结构,可以看成是[邻接表]和[逆邻接表] 的结合. 图中每条弧对应一个[弧结点],每个顶点对应一个[顶点结点] 弧结点 -------------------------------

[ACM] POJ 3686 The Windy&#39;s (二分图最小权匹配,KM算法,特殊建图)

The Windy's Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4158   Accepted: 1777 Description The Windy's is a world famous toy factory that owns M top-class workshop to make toys. This year the manager receivesN orders for toys. The man

算法导论——lec 10 图的基本算法及应用

搜索一个图是有序地沿着图的边訪问全部定点, 图的搜索算法能够使我们发现非常多图的结构信息, 图的搜索技术是图算法邻域的核心. 一. 图的两种计算机表示 1. 邻接表: 这样的方法表示稀疏图比較简洁紧凑. typedef struct{ int adjvex;//邻接顶点的位置 struct ArcNode *next; int weight;//边的权重 }ArcNode; typedef struct{ VertexType data; ArcNode *firstarc; }VNode, A

【数据结构】拓扑排序、最短路径算法、Dijkstra算法、无环图等等

图的定义 图(graph)G = (V,E)由顶点(vertex)的集V和边(Edge)的集E组成.有时也把边称作弧(arc),如果点对(v,w)是有序的,那么图就叫做有向的图(有向图).顶点v和w邻接(adjacent)当且仅当(v,w)属于E. 如果无向图中从每一个顶点到其他每个顶点都存在一条路径,则称该无向图是连通的(connected).具有这样性质的有向图称为是强连通的(strongly connected).如果有向图不是强连通的,但它的基础图(underlying graph)(也

数据结构与算法系列研究七——图、prim算法、dijkstra算法

图.prim算法.dijkstra算法 1. 图的定义 图(Graph)可以简单表示为G=<V, E>,其中V称为顶点(vertex)集合,E称为边(edge)集合.图论中的图(graph)表示的是顶点之间的邻接关系. (1) 无向图(undirect graph)      E中的每条边不带方向,称为无向图.(2) 有向图(direct graph)      E中的每条边具有方向,称为有向图.(3) 混合图       E中的一些边不带方向, 另一些边带有方向.(4) 图的阶      指

&quot;《算法导论》之‘图’&quot;:不带权二分图最大匹配(匈牙利算法)

博文“二分图的最大匹配.完美匹配和匈牙利算法”对二分图相关的几个概念讲的特别形象,特别容易理解.本文介绍部分主要摘自此博文. 还有其他可参考博文: 趣写算法系列之--匈牙利算法 用于二分图匹配的匈牙利算法 1. 前言 二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图.准确地说:把一个图的顶点划分为两个不相交集 U 和V ,使得每一条边都分别连接U.V中的顶点.如果存在这样的划分,则此图为一个二分图.二分图的一个等价定义是:不含有「含奇数条边的环」的图.

算法之判断一个图是否有环

在一些经典算法中,经常需要判断一些图是否具有环路,比如拓扑排序,需要在最初判断该图是否有环路,如有有环路,则无法找到最长的一条线,比如dijkstra算法,每找到一条最短的边,都要判断找到的边和现有的树是否已经构成了环路. 因此,在这篇博客,我们重点来说一个判断图是否有环的算法. 首先我们介绍一个对于无向图和有向图通用的算法,先讲算法思路: 1.统计各个图中各个点的入度数(能够到达这个点的点). 2.然后找出入度数为0的点(无向图找入度数为1的点). 3.删除入度数为0的点,将其边也删除. 4.