018加权有向边及加权有向图的实现

图学习笔记索引

001自定义输入流In类实现
002背包数据类型Bag实现
003无向图数据类型实现
004基于图的深度优先搜索
005使用深度优先搜索找图中的所有连通分量
005-1基于深度优先搜索查找图中连通路径
006基于深度优先搜索判断图中是否存在环
007基于深度优先搜索判断一个无向图图是否是一个二分图
008广度优先搜索查找连通图中的最短路径
009有向图数据类型实现
010有向图的可达性
011带权重的无向边数据类型Edge实现
012加权无向图数据类型实现
013寻找有向环
014有向图中基于深度优先搜索的顶点排序
015查找、排序、符号表、散列表等算法实现(1)
016最小生成树Prim算法延时实现
017最小生成树Prim算法即时实现

本文参考《算法(第4版)》

1.依赖类

从文件中读取图的顶点关系。
tinyEWG.txt中的内容:
8
16
4 5 0.35
4 7 0.37
5 7 0.28
0 7 0.16
1 5 0.32
0 4 0.38
2 3 0.17
1 7 0.19
0 2 0.26
1 2 0.36
1 3 0.29
2 7 0.34
6 2 0.40
3 6 0.52
6 0 0.58
6 4 0.93
点击文字获取:001自定义输入流In类实现
点击文字获取:索引优先队列IndexMinPQ实现参考博客

2.加权有向边实现

package algorithms.graph; 
/*
 * 带权重的有向边数据类型
 * */
public class DirectedEdge implements Comparable<DirectedEdge>{
    private final int v;
    private final int w;
    private final double weight;
    public DirectedEdge(int v, int w, double weight){
    	this.v = v;
    	this.w = w;
    	this.weight = weight;
    }
    public int from(){
    	 return v;
    }
    public int to(){
    	 return w; 
    }
    public double weight(){
    	return this.weight;
    }
	@Override
	public int compareTo(DirectedEdge that) {
		double cmp = this.weight - that.weight;
		if(cmp < 0.0)      return -1;
		else if(cmp > 0.0) return +1;
		return 0;
	}
	public String toString() {
		 return String.format("%d-%d %.2f", v, w, weight);
	}
	public static void main(String[] args) {
		DirectedEdge edge1 = new DirectedEdge(0, 1, 0.5);
		System.out.println(edge1.v);
		System.out.println(edge1.from());
		System.out.println(edge1.to());
		System.out.println(edge1);
		DirectedEdge edge2 = new DirectedEdge(1, 2, 0.7);
		System.out.println(edge1.compareTo(edge2)); 
	} 
}

输出:

0
0
1
0-1 0.50
-1

2.加权有向图的实现

package algorithms.graph; 
import java.io.IOException;

import algorithms.model.Bag;

public class EdgeWeightedDigraph {
    private final int V;
    private int E;
    private Bag<DirectedEdge>[] adj;
    public EdgeWeightedDigraph(int V){
    	this.V = V;
    	this.E = 0;
    	adj = (Bag<DirectedEdge>[]) new Bag[V];
    	for(int v = 0; v < V; v++)
    		adj[v] = new Bag<DirectedEdge>(); 
    }
    public EdgeWeightedDigraph(In in){
    	this(Integer.parseInt(in.readStr())); 
    	int edges = Integer.parseInt(in.readStr());  
    	for(int e = 0; e < edges; e++){
    		int v = Integer.parseInt(in.readStr());
    		int w = Integer.parseInt(in.readStr());
    		double weight = Double.parseDouble(in.readStr());
    		adj[v].add(new DirectedEdge(v, w, weight)); 
    	} 
    }
    public void addEdge(DirectedEdge e){
	   adj[e.from()].add(e);
	   E++;
    }
    public Iterable<DirectedEdge> adj(int v){
       return adj[v];
    }
    public Iterable<DirectedEdge> edges(){
    	Bag<DirectedEdge> bag = new Bag<DirectedEdge>();
    	for(int v = 0; v < V; v++)
    		for(DirectedEdge e : adj[v])
    			bag.add(e);
    	return bag;
    }
    public int V(){
    	return this.V;
    }
    public int E(){
    	return this.E;
    }
    public String toString(){
    	StringBuilder sb = new StringBuilder();
    	for(int v = 0; v < V; v++){
    		sb.append(v);
    		sb.append(" : ");
    		for(DirectedEdge e : adj(v)){  
    			sb.append(e.toString());
    			sb.append("  ");
    	    }
    		sb.append("\n"); 
    	}      
    	return sb.toString();
    }
	public static void main(String[] args) throws IOException {
		 In in = new In("D:\\tinyEWD.txt"); 
		 System.out.println("图文件:");
		 for(String v : in.getStr())
				System.out.print(v + " "); 
		 System.out.println();
		 System.out.println("图邻接表:");
		 EdgeWeightedDigraph EWD = new EdgeWeightedDigraph(in);
		 System.out.println(EWD);
		 System.out.println("权重边:");
		 for(DirectedEdge e : EWD.edges())
			System.out.println(e);
	}
}

输出:

图文件:
8 15 4 5 0.35 5 4 0.35 4 7 0.37 5 7 0.28 7 5 0.28 5 1 0.32 0 4 0.38 0 2 0.26 7 3 0.39 1 3 0.29 2 7 0.34 6 2 0.40 3 6 0.52 6 0 0.58 6 4 0.93 
图邻接表:
0 : 0-2 0.26  0-4 0.38  
1 : 1-3 0.29  
2 : 2-7 0.34  
3 : 3-6 0.52  
4 : 4-7 0.37  4-5 0.35  
5 : 5-1 0.32  5-7 0.28  5-4 0.35  
6 : 6-4 0.93  6-0 0.58  6-2 0.40  
7 : 7-3 0.39  7-5 0.28  

权重边:
7-5 0.28
7-3 0.39
6-2 0.40
6-0 0.58
6-4 0.93
5-4 0.35
5-7 0.28
5-1 0.32
4-5 0.35
4-7 0.37
3-6 0.52
2-7 0.34
1-3 0.29
0-4 0.38
0-2 0.26
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值