无向图的多重邻接表(作业)

package graph;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;

import graph.MultilinkedListUndirectedGraph.edges;

public class MultilinkedListUndirectedGraph<T> implements IGraph {
	private static GraphKind graghKind = GraphKind.UnDirectGraph;
	ArrayList<vertices> vertices; 
	ArrayList<edges> edges;
	
	private void set(T[] data) {
		this.vertices = new ArrayList<>(data.length);
		for(int i = 0 ; i < data.length ; i++) {
			vertices.add(new vertices(data[i]));
		}
	}
	private String showVertices() {
		if(this.vertices == null) {
			return "null";
		}
		if(this.vertices.size() == 0) {
			return " ";
		}
		String str = "";
		for(int i = 0 ; i < this.vertices.size() ; i++) {
			str += this.vertices.get(i).data.toString();
		}
		return str;
	}
	static class vertices<T>{
		T data = null;
		edges edges = null;
		vertices(T data){
			this.data = data;
		}
		public void setVertices(T data) {
			this.data = data;
		}

	}
	
	static class edges{
		double weight = 0;
		int indexOfA;
		edges Aedges = null;
		int indexOfB;
		edges Bedges = null;
		edges(){
		}
		edges(int indexOfA, edges Aedges, int indexOfB, edges Bedges){
			this.indexOfA = indexOfA;
			this.Aedges = Aedges;
			this.indexOfB = indexOfB;
			this.Bedges = Bedges;
		}
		edges(double weight, int indexOfA, edges Aedges, int indexOfB, edges Bedges){
			this.weight = weight;
			this.indexOfA = indexOfA;
			this.Aedges = Aedges;
			this.indexOfB = indexOfB;
			this.Bedges = Bedges;
		}
	}
	

	@Override
	public GraphKind getGraphKind() {
		// TODO Auto-generated method stub
		return GraphKind.UnDirectGraph;
	}

	@Override
	public int numberOfVertices() {
		// TODO Auto-generated method stub
		return vertices.size();
	}

	@Override
	public int numberOfEdges() {
		// TODO Auto-generated method stub
		return edges.size();
	}

	@Override
	public int vertex(Object x) {
		// TODO Auto-generated method stub
		for(int i = 0 ; i < vertices.size() ; i++) {
			if(vertices.get(i).data.equals(x)) {
				return i;
			}
		}
		return -1;
	}

	@Override
	public Object vertexValue(int v) {
		// TODO Auto-generated method stub
		return vertices.get(v).data;
	}

	@Override
	public int inDegree(int v) {
		// TODO Auto-generated method stub
		return degree(v);
	}

	@Override
	public int outDegree(int v) {
		// TODO Auto-generated method stub
		return degree(v);
	}

	@Override
	public int degree(int v) {
		// TODO Auto-generated method stub
		int count = 0;
		if(edges == null) {
			return 0;
		}
		for(int i = 0 ; i < this.edges.size() ; i++) {
			if(edges.get(i).indexOfA == v || edges.get(i).indexOfB == v) {
				count++;
			}
		}
		return count;
	}
	
	private int countDegree(int v) {
		if(v >= this.vertices.size()) {
			return -1;
		}
		return countDegree(this.vertices.get(v).edges, v);
	}
	
	public int countDegree(edges edge, int v) {
		int count = 0;
		if(edge == null) {
			return 0;
		}
		if(edge.indexOfA == v) {
			count += countDegree(edge.Aedges, v) + 1;
		}
		else if(edge.indexOfB == v) {
			count += countDegree(edge.Bedges, v) + 1;
		}
		return count;
	}

	@Override
	public boolean addEdge(int u, int v) {
		// TODO Auto-generated method stub
		if(u == v) {
			return false;
		}
		if(u >= this.vertices.size() || v >= this.vertices.size() || u < 0 || v < 0) {
			return false;
		}
		if(u > v) {
			int temp = u;
			u = v;
			v = temp;
			
		}
		if(edges == null) {
			this.edges = new ArrayList<edges>();
		}
		if(this.vertices.get(u).edges == null && this.vertices.get(v).edges == null) {//假如两个都没有加入过边则执行此段
			edges edge = new edges(u,null,v,null);
			edges.add(edge);
			vertices.get(u).edges = edge;
			vertices.get(v).edges = edge;
			return true;
		}
		for(int i = 0 ; i < edges.size() ; i++) {//如果之前存在这条边就不再添加
			if((edges.get(i).indexOfA == u && edges.get(i).indexOfB == v)) {
				return false;//之前有过这条边
			}
		}
		for(int i = 0 ; i < edges.size() ; i++) {
			edges edge = new edges(u,null,v,null);
			if((edges.get(i).indexOfA == u && edges.get(i).Aedges == null)) {
				edges.add(edge);
				edges.get(i).Aedges = edge;
				if(this.vertices.get(v).edges == null) {
					vertices.get(v).edges = edge;
					return true;
				}
				for(i = 0; i < edges.size() ; i++) {
					if(edges.get(i).indexOfB == v && edges.get(i).Bedges == null) {
						edges.get(i).Bedges = edge;
						return true;
					}
					if(edges.get(i).indexOfA == v && edges.get(i).Aedges == null) {
						edges.get(i).Aedges = edge;
						return true;
					}
				}
				
			}
			if((edges.get(i).indexOfA == v && edges.get(i).Aedges == null)) {
				edges.add(edge);
				edges.get(i).Aedges = edge;
				if(this.vertices.get(u).edges == null) {
					vertices.get(u).edges = edge;
					return true;
				}
				for(i = 0; i < edges.size() ; i++) {
					if(edges.get(i).indexOfB == u && edges.get(i).Bedges == null) {
						edges.get(i).Bedges = edge;
						return true;
					}
					if(edges.get(i).indexOfA == u && edges.get(i).Aedges == null) {
						edges.get(i).Aedges = edge;
						return true;
					}
				}
				
			}
			if(edges.get(i).indexOfB == v && edges.get(i).Bedges == null) {
				edges.add(edge);
				edges.get(i).Bedges = edge;
				if(this.vertices.get(u).edges == null) {
					vertices.get(u).edges = edge;
					return true;
				}
				for(i = 0 ; i < edges.size() ; i++) {
					if(edges.get(i).indexOfA == u && edges.get(i).Aedges == null) {
						edges.get(i).Aedges = edge;
						return true;
					}
					if(edges.get(i).indexOfB == u && edges.get(i).Bedges == null) {
						edges.get(i).Bedges = edge;
						return true;
					}
				}

			}
			if(edges.get(i).indexOfB == u && edges.get(i).Bedges == null) {
				edges.add(edge);
				edges.get(i).Bedges = edge;
				if(this.vertices.get(v).edges == null) {
					vertices.get(v).edges = edge;
					return true;
				}
				for(i = 0 ; i < edges.size() ; i++) {
					if(edges.get(i).indexOfA == v && edges.get(i).Aedges == null) {
						edges.get(i).Aedges = edge;
						return true;
					}
					if(edges.get(i).indexOfB == v && edges.get(i).Bedges == null) {
						edges.get(i).Bedges = edge;
						return true;
					}
				}

			}
		}

		return false;
	}

	@Override
	public boolean removeEdge(int u, int v) {
		if(u >= this.vertices.size() || v >= this.vertices.size() || u < 0 || v < 0) {
			return false;
		}
		if(u > v) {
			int temp = u;
			u = v;
			v = temp;
		}
		if( this.vertices.get(u).edges.indexOfA == u && this.vertices.get(u).edges.indexOfB == v
				&& this.vertices.get(v).edges.indexOfA == u && this.vertices.get(v).edges.indexOfB == v
				) {
			edges edge = this.vertices.get(u).edges;
			this.vertices.get(u).edges = edge.Aedges;
			this.vertices.get(v).edges = edge.Bedges;
			for(int i = 0 ; i < edges.size() ; i++) {
				if(edges.get(i).indexOfA == u && edges.get(i).indexOfB == v) {
					edges.remove(i);
					edge = null;
					return true;
				}
			}
		}
		if( this.vertices.get(u).edges.indexOfA == u && this.vertices.get(u).edges.indexOfB == v) {
			edges edge = this.vertices.get(u).edges;
			this.vertices.get(u).edges = edge.Aedges;
			for(int i = 0 ; i < edges.size() ; i++) {
				if(edges.get(i).Aedges != null && edges.get(i).Aedges.indexOfA == u && edges.get(i).Aedges.indexOfB == v) {
					edges.get(i).Aedges = edge.Bedges;
					break;
				}
				if(edges.get(i).Bedges != null && edges.get(i).Bedges.indexOfA == u && edges.get(i).Bedges.indexOfB == v) {
					edges.get(i).Bedges = edge.Bedges;
					break;
				}
			}
			for(int i = 0 ; i < edges.size() ; i++) {
				if(edges.get(i).indexOfA == u && edges.get(i).indexOfB == v) {
					edges.remove(i);
					edge = null;
					return true;
				}
			}
		}
		if( this.vertices.get(v).edges.indexOfA == u && this.vertices.get(v).edges.indexOfB == v) {
			edges edge = this.vertices.get(v).edges;
			this.vertices.get(v).edges = edge.Bedges;
			for(int i = 0 ; i < edges.size() ; i++) {
				if(edges.get(i).Aedges != null && edges.get(i).Aedges.indexOfA == u && edges.get(i).Aedges.indexOfB == v) {
					edges.get(i).Aedges = edge.Aedges;
					break;
				}
				if(edges.get(i).Bedges != null && edges.get(i).Bedges.indexOfA == u && edges.get(i).Bedges.indexOfB == v) {
					edges.get(i).Bedges = edge.Aedges;
					break;
				}
			}
			for(int i = 0 ; i < edges.size() ; i++) {
				if(edges.get(i).indexOfA == u && edges.get(i).indexOfB == v) {
					edges.remove(i);
					edge = null;
					return true;
				}
			}
		}
		int k = 0;
		edges edge = null;
		for(; k < edges.size() ; k++) {
			if(edges.get(k).indexOfA == u && edges.get(k).indexOfB == v) {
				edge = edges.get(k);
				break;
			}
		}
		for(int i = 0 ; i < edges.size() ; i++) {
			if(edges.get(i).indexOfA == u && edges.get(i).Aedges != null && edges.get(i).Aedges.indexOfA == u && edges.get(i).Aedges.indexOfB == v) {
				edges.get(i).Aedges = edge.Aedges;
				break;
			}
			if(edges.get(i).indexOfB == u && edges.get(i).Bedges != null && edges.get(i).Bedges.indexOfA == u && edges.get(i).Bedges.indexOfB == v) {
				edges.get(i).Bedges = edge.Aedges;
				break;
			}
		}
		for(int i = 0 ; i < edges.size() ; i++) {
			if(edges.get(i).indexOfA == v && edges.get(i).Aedges != null && edges.get(i).Aedges.indexOfA == u && edges.get(i).Aedges.indexOfB == v) {
				edges.get(i).Aedges = edge.Bedges;
				break;
			}
			if(edges.get(i).indexOfB == v && edges.get(i).Bedges != null && edges.get(i).Bedges.indexOfA == u && edges.get(i).Bedges.indexOfB == v) {
				edges.get(i).Bedges = edge.Bedges;
				break;
			}
		}
		edges.remove(k);
		edge = null;
		return true;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Character[] data = { '0', '1', '2', '3', '4', '5' };
		MultilinkedListUndirectedGraph<Character> graph = new MultilinkedListUndirectedGraph<>();
		graph.set(data);
		System.out.println("nods=" + graph.numberOfVertices());

		graph.addEdge(0, 2);
		graph.addEdge(1, 2);//
		graph.addEdge(1, 4);
		graph.addEdge(1, 5);
		//
		graph.addEdge(2, 3);
//		graph.addEdge(2, 3);
		//
		graph.addEdge(3, 5);
		graph.addEdge(2, 3);
		graph.addEdge(4, 3);
		graph.addEdge(4, 5);
		graph.addEdge(3, 4);
//		System.out.println(graph.vertex('5'));
//		System.out.println(graph.vertex('7'));

		System.out.println("edges=" + graph.numberOfEdges());
		
		System.out.println("outdegree of 1=" + graph.outDegree(1));
		System.out.println("outdegree of 2=" + graph.outDegree(2));
		System.out.println("outdegree of 3=" + graph.outDegree(3));
		System.out.println(graph.countDegree(0));
		System.out.println(graph.countDegree(2));
		System.out.println(graph.removeEdge(0, 2));
		System.out.println(graph.countDegree(0));
		System.out.println(graph.countDegree(2));
		System.out.println("after remove edges=" + graph.numberOfEdges());
		System.out.println("outdegree of 0=" + graph.outDegree(0));
		System.out.println(graph.removeEdge(2, 3));
		System.out.println("after remove edges=" + graph.numberOfEdges());
		System.out.println("outdegree of 2=" + graph.outDegree(2));
		System.out.println("outdegree of 3=" + graph.outDegree(3));
		System.out.println("outdegree of 4=" + graph.outDegree(4));
		System.out.println("indegree of 5=" + graph.inDegree(5));
		System.out.println(graph.removeEdge(1, 5));
		System.out.println("indegree of 5=" + graph.inDegree(5));
		System.out.println(graph.removeEdge(1, 2));
		System.out.println("after remove edges=" + graph.numberOfEdges());

		System.out.println("outdegree of 1=" + graph.outDegree(1));
		System.out.println("outdegree of 2=" + graph.outDegree(2));
		System.out.println(graph.countDegree(1));
		System.out.println(graph.countDegree(2));

		System.out.println("value of 4=" + graph.vertexValue(4));
		
		graph.addEdge(2, 3);
		System.out.println("indegree of 3=" + graph.inDegree(3));
		System.out.println("indegree of 4=" + graph.inDegree(4));
		System.out.println(graph.removeEdge(3, 4));
		System.out.println("indegree of 3=" + graph.inDegree(3));
		System.out.println("indegree of 4=" + graph.inDegree(4));
		System.out.println("---------");
		System.out.println(graph.showVertices());

	}

	@Override
	public double getWeight(int u, int v) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public void addWeightedEdge(int u, int v, double w) {
		// TODO Auto-generated method stub
	}
	@Override
	public Iterator iterator(int v) {
		// TODO Auto-generated method stub
		return null;
	}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对任意给定的图(顶点数不小于20,边数不少于30,图的类型可以是有向图、无向图、有向网、无向网),能够输入图的顶点和边(或弧)的信息,并存储到相应存储结构(邻接矩阵、邻接表、十字链表、邻接多重表,任选其中两种类型),对自己所创建的图完成以下操作: 对无向图求每个顶点的度,或对有向图求每个顶点的入度和出度(5分) 完成插入顶点和边(或弧)的功能(5分) 完成删除顶点和边(或弧)的功能(5分) 两种存储结构的转换(5分),如果其中一种存储结构为十字链表或邻接多重表则增加5分。 输出图的深度优先遍历序列或广度优先遍历序列(5分) 求图的深度优先或广度优先的生成树(或生成森林)(存储结构为孩子-兄弟链表),并对生成树进行遍历(15分) 判断图的连通性,输出连通分量的个数(5分) 判断图中是否存在环,无向图5分,有向图10分 给出顶点u和v,判断u到v是否存在路径(5分) 10、求顶点u到v的一条简单路径(10分) 11、求顶点u到v的所有简单路径(15分) 12、求顶点u到v的最短路径(10分) 13、求顶点u到其余各顶点的最短路径(15分) 14、求任两个顶点之间的最短路径(15分) 15、求最小生成树(15分) 16、对于有一个源点和一个汇点的有向网,求关键路径(20分) 编程环境可以是C、VC++、JAVA,每位同学从上述目中选择100分的目,注意,必须选择第1-6
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值