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;
}
}
无向图的多重邻接表(作业)
最新推荐文章于 2023-08-10 21:59:51 发布