012加权无向图数据类型实现

图学习笔记索引

图学习笔记索引(全部)
001自定义输入流In类实现
002背包数据类型Bag实现
003无向图数据类型实现
004基于图的深度优先搜索
005使用深度优先搜索找图中的所有连通分量
005-1基于深度优先搜索查找图中连通路径
006基于深度优先搜索判断图中是否存在环
007基于深度优先搜索判断一个无向图图是否是一个二分图
008广度优先搜索查找连通图中的最短路径
009有向图数据类型实现
010有向图的可达性
011带权重的无向边数据类型Edge实现
012加权无向图数据类型实现

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

1.带权重的无向边数据类型实现

1)图文件读取
点击文字获取:流读取类In参考链接
从文件中读取图的顶点关系。
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

2)代码实现
点击文字获取:带权重的无向边数据类型Edge实现参考链接

2.加权无向图数据类型实现

package algorithms.graph; 
import java.io.IOException;
import algorithms.model.Bag;
/*
 * 加权无向图数据类型实现
 * */
public class EdgeWeightedGraph {
    private final int V;
    private int E;
    private Bag<Edge>[] adj;
    public EdgeWeightedGraph(int V){
    	this.V = V;
    	this.E = 0;
    	this.adj = (Bag<Edge>[])new Bag[V];
    	for(int v = 0; v < V; v++)
    		adj[v] = new Bag<Edge>();
    }
    public EdgeWeightedGraph(In in){ 
    	this(in.readInt()); 
    	int edges = in.readInt();
    	for(int e = 0; e < edges; e++){
    		int v = in.readInt();
    		int w = in.readInt();
    		double weight = Double.parseDouble(in.readStr());
    		adj[v].add(new Edge(v, w, weight));
    		adj[w].add(new Edge(w, v, weight));
    	} 
    }
    public void addEdge(Edge e){
    	int v = e.either();
    	int w = e.other(v);
    	adj[v].add(e);
    	adj[w].add(e);
    	E++;
    }
    public int V(){ return this.V; }
    public int E(){ return this.E; }
    
    public Iterable<Edge> adj(int v){
    	return adj[v];
    }
    public Iterable<Edge> edges(){
    	Bag<Edge> bag = new Bag<Edge>();
    	for(int v = 0; v < V; v++)
    		for(Edge e : adj[v])
    			if(e.other(v) > v)
    		      bag.add(e);
		return bag; 
    }
    public String toString(){
    	StringBuilder sb = new StringBuilder();
    	for(int v = 0; v < V; v++){
    		sb.append(v);
    		sb.append(" : ");
    		for(Edge 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:\\tinyEWG.txt"); 
		 for(String v : in.getStr())
				System.out.print(v + " "); 
		 EdgeWeightedGraph EWG = new EdgeWeightedGraph(in);
		 System.out.println(EWG);
		 for(Edge e : EWG.edges())
			System.out.println(e);
	} 
}


输出


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 0 : 0-6 0.58 | 0-2 0.26 | 0-4 0.38 | 0-7 0.16 | 
1 : 1-3 0.29 | 1-2 0.36 | 1-7 0.19 | 1-5 0.32 | 
2 : 2-6 0.40 | 2-7 0.34 | 2-1 0.36 | 2-0 0.26 | 2-3 0.17 | 
3 : 3-6 0.52 | 3-1 0.29 | 3-2 0.17 | 
4 : 4-6 0.93 | 4-0 0.38 | 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-3 0.52 | 6-2 0.40 | 
7 : 7-2 0.34 | 7-1 0.19 | 7-0 0.16 | 7-5 0.28 | 7-4 0.37 | 

5-7 0.28
4-5 0.35
4-7 0.37
4-6 0.93
3-6 0.52
2-3 0.17
2-7 0.34
2-6 0.40
1-5 0.32
1-7 0.19
1-2 0.36
1-3 0.29
0-7 0.16
0-4 0.38
0-2 0.26
0-6 0.58

2.总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值