1 package graphic; 2 import queue.*; 3 4 public class AdjacencyGraph implements Graph { 5 6 private final int MaxValue = 1000; // for not conjoint 7 private int nNode; // numbers of node 8 private int nEdge; // numbers of edge 9 private int type; // type of graphic 10 private int[][] adjacency; // asume the type of element is int 11 12 public int MaxValue() { 13 return MaxValue; // return the const MaxValue 14 } 15 16 public int[][] getArray() { 17 return adjacency; // return adjacency 18 } 19 20 public AdjacencyGraph(int nNode, int type) { 21 if (type < 1 || type > 3) { 22 System.out.print("Initial failed!\n"); 23 System.exit(1); 24 } 25 26 this.nNode = nNode; 27 nEdge = 0; 28 this.type = type; 29 this.adjacency = new int[nNode][nNode]; 30 31 for (int i = 0; i < nNode; i++) { 32 for (int j = 0; j < nNode; j++) { 33 if (i == j) { 34 adjacency[i][j] = 0; 35 } else if (type == 0 || type == 2) { 36 adjacency[i][j] = 0; 37 } else { 38 adjacency[i][j] = MaxValue; 39 } 40 } 41 } 42 } 43 44 @Override 45 public void createGraph(EdgeElement[] d) { 46 // TODO Auto-generated method stub 47 int i = 0; 48 for (; i < d.length; i++) { 49 int v1 = d[i].fromVex; 50 int v2 = d[i].endVex; 51 verify(v1, v2); 52 if (type == 0) { 53 adjacency[v1][v2] = adjacency[v2][v1] = 1; 54 } else if (type == 1) { 55 adjacency[v1][v2] = adjacency[v2][v1] = d[i].weight; 56 } else if (type == 2) { 57 adjacency[v1][v2] = 1; 58 } else { 59 adjacency[v1][v2] = d[i].weight; 60 } 61 } 62 nEdge = i; 63 } 64 65 @Override 66 public int graphType() { 67 // TODO Auto-generated method stub 68 return type; 69 } 70 71 @Override 72 public int vertices() { 73 // TODO Auto-generated method e 74 return nNode; 75 } 76 77 @Override 78 public int edges() { 79 // TODO Auto-generated method stub 80 return nEdge; 81 } 82 83 @Override 84 public boolean find(int i, int j) { 85 // TODO Auto-generated method stub 86 87 if (adjacency[i][j] != 0 && adjacency[i][j] != MaxValue) { 88 return true; 89 } 90 return false; 91 } 92 93 @Override 94 public void putEdge(EdgeElement edge) { 95 // TODO Auto-generated method stub 96 int v1 = edge.fromVex; 97 int v2 = edge.endVex; 98 verify(v1, v2); 99 if (adjacency[v1][v2] == 0 || adjacency[v1][v2] == MaxValue) { 100 nEdge++; 101 } else { 102 System.out.print("the edge is already exits!"); 103 System.exit(1); 104 } 105 if (type == 0) { 106 adjacency[v1][v2] = adjacency[v2][v1] = 1; 107 } else if (type == 1) { 108 adjacency[v1][v2] = adjacency[v2][v1] = edge.weight; 109 } else if (type == 2) { 110 adjacency[v1][v2] = 1; 111 } else { 112 adjacency[v1][v2] = edge.weight; 113 } 114 } 115 116 @Override 117 public void removeEdge(int i, int j) { 118 // TODO Auto-generated method stub 119 verify(i, j); 120 if (adjacency[i][j] == 0 || adjacency[i][j] == MaxValue) { 121 System.out.println("the edge you want to remove is not exits!"); 122 System.exit(1); 123 } 124 if (type == 0) { 125 adjacency[i][j] = adjacency[j][i] = 0; 126 } else if (type == 1) { 127 adjacency[i][j] = adjacency[j][i] = MaxValue; 128 } else if (type == 2) { 129 adjacency[i][j] = 0; 130 } else { 131 adjacency[i][j] = MaxValue; 132 } 133 nEdge--; // do not forget 134 } 135 136 @Override 137 public int degree(int i) { 138 int nDegree = 0; 139 if (type < 2) { 140 for (int j = 0; j < nNode; j++) { 141 if (adjacency[i][j] != 0 || adjacency[i][j] == MaxValue) { 142 nDegree++; 143 } 144 } 145 } else { 146 nDegree = inDegree(i) + outDegree(i); 147 } 148 return nDegree; 149 } 150 151 @Override 152 public int inDegree(int i) { 153 // TODO Auto-generated method stub 154 verify(i); 155 int nDegree = 0; 156 if (type < 2) { 157 nDegree = -1; 158 } else { 159 for (int j = 0; j < nNode; j++) { 160 if (adjacency[j][i] != 0 && adjacency[j][i] != MaxValue) { 161 nDegree++; 162 } 163 } 164 } 165 166 return nDegree; 167 } 168 169 @Override 170 public int outDegree(int i) { 171 // TODO Auto-generated method stub 172 verify(i); 173 int nDegree = 0; 174 if (type < 2) { 175 nDegree = -1; 176 } else { 177 for (int j = 0; j < nNode; j++) { 178 if (adjacency[i][j] != 0 && adjacency[i][j] != MaxValue) { 179 nDegree++; 180 } 181 } 182 } 183 184 return nDegree; 185 } 186 187 @Override 188 public void depthFirstSearch(int v) { // start search from node v 189 // TODO Auto-generated method stub 190 boolean[] visited = new boolean[nNode]; 191 for (int i = 0; i < nNode; i++) { 192 visited[i] = false; 193 } 194 dfs(v, visited); 195 System.out.println(); 196 } 197 198 @Override 199 public void breadthFirstSearch(int v) { 200 // TODO Auto-generated method stub 201 boolean[] visited = new boolean[nNode]; 202 for (int i = 0; i < nNode; i++) { 203 visited[i] = false; 204 } 205 bfs(v, visited); 206 System.out.println(); 207 } 208 209 private void dfs(int i, boolean[] visited) { 210 System.out.print(i + " "); 211 visited[i] = true; 212 for (int j = 0; j < nNode; j++) { 213 if (adjacency[i][j] != 0 && adjacency[i][j] != MaxValue && !visited[j]) { 214 dfs(j, visited); 215 } 216 } 217 } 218 219 private void bfs(int i, boolean[] visited) { 220 SequenceQueue queue = new SequenceQueue(); 221 System.out.print(i + " "); 222 visited[i] = true; 223 queue.add(i); 224 225 while (!queue.isEmpty()) { 226 int k = (Integer)queue.remove(); 227 for (int j = 0; j < nNode; j++) { 228 if (adjacency[k][j] != 0 && adjacency[k][j] != MaxValue && !visited[j]) { 229 System.out.print(j + " "); 230 visited[j] = true; 231 queue.add(j); 232 } 233 } 234 } 235 } 236 237 public void output() { 238 int i, j; 239 System.out.print("V = {"); 240 for (i = 0; i < nNode-1; i++) { 241 System.out.print(i + ", "); 242 } 243 System.out.println(nNode-1 + "}"); 244 if (type == 0 || type == 2) { 245 for (i = 0; i < nNode; i++) { 246 for (j = 0; j < nNode; j++) { 247 if (type == 0) { // unweighted, undirected 248 if (i < j) { 249 System.out.print("(" + i + ", " + j + "), "); 250 } 251 } else { // unweighted, directed 252 System.out.print("<" + i + ", " + j + ">, "); 253 } 254 } 255 } 256 } else { 257 for (i = 0; i < nNode; i++) { 258 for (j = 0; j < nNode; j++) { 259 if (adjacency[i][j] != 0 && adjacency[i][j] != MaxValue) { 260 if (type == 1) {// weighted, undirected 261 System.out.print("(" + i + ", " + j + "), " + adjacency[i][j] + ", "); 262 } else { // weighted, directed 263 System.out.print("<" + i + ", " + j + ">, " + adjacency[i][j] + ", "); 264 } 265 } 266 } 267 } 268 } 269 System.out.println("}"); 270 } 271 272 public void verify(int... args) { // some refactor 273 if (args.length == 1) { 274 if (args[0] > nNode-1 || args[0] < 0) { 275 System.out.println("the invalid position!"); 276 System.exit(1); 277 } 278 } else { 279 if (args[0] < 0 || args[0] > nNode-1 || args[1] < 0 || args[1] > nNode-1 || args[0] == args[1]) { 280 System.out.println("invalid position!"); 281 System.exit(1); 282 } 283 } 284 } 285 286 public static void main(String[] args) { 287 Graph graph = new AdjacencyGraph(5, 3); 288 int[][] a = { 289 {0, 1, 2}, {0, 2, 3}, {0, 3, 8}, {1, 3, 12}, 290 {2, 0, 6}, {2, 3, 6}, {2, 4, 1}, {3, 4, 4} 291 }; 292 293 EdgeElement[] matrix = new EdgeElement[a.length]; 294 for (int i = 0; i < matrix.length; i++) { 295 matrix[i] = new EdgeElement(a[i][0], a[i][1], a[i][2]); 296 } 297 298 graph.createGraph(matrix); 299 300 System.out.println("the sequence of deep first search start from 0: "); 301 graph.depthFirstSearch(0); 302 303 System.out.println("the sequence of bread frist search start from 0: "); 304 graph.breadthFirstSearch(0); 305 306 graph.output(); 307 308 System.out.println("the degree, indegree & outdegree of 0: "); 309 System.out.println(graph.degree(0) + ", " + graph.inDegree(0) + ", " + graph.outDegree(0)); 310 311 graph.putEdge(new EdgeElement(4, 1, 5)); 312 313 graph.removeEdge(0, 2);
314
315 System.out.println("Is there exits a edge: (2, 3)?" + graph.find(2, 3));
316
317 graph.output(); 318 319 System.out.println("the type of the graph: " + graph.graphType() + "\n" + 320 "the vertices of the graph: " + graph.vertices() + "\n" + 321 "the edges of the graph: " + graph.edges()); 322 } 323 }
图的边类:
1 1 package graphic; 2 2 3 3 public class EdgeElement { 4 4 int fromVex; 5 5 int endVex; 6 6 int weight; 7 7 8 8 public EdgeElement(int from, int end) { 9 9 fromVex = from; 10 10 endVex = end; 11 11 weight = 1; 12 12 } 13 13 14 14 public EdgeElement(int from, int end, int wgt) { 15 15 fromVex = from; 16 16 endVex = end; 17 17 weight = wgt; 18 18 } 19 19 }
1 1 package graphic; 2 2 3 3 public enum GraphType { 4 4 unweighted_undirected_graph, // refer to 0 5 5 weighted_undirected_graph, // ... 1 6 6 unweighted_directed_graph, // ... 2 7 7 weighted_directed_graph // ... 3 8 8 }
1 package graphic; 2 3 public interface Graph { 4 5 void createGraph(EdgeElement[] d); // 根据边集数组参数d建立一个图 6 7 int graphType(); // 返回图类型 8 9 int vertices(); // 返回图中顶点数 10 11 int edges(); // 返回图中边数 12 13 boolean find(int i, int j); // 查找(i, j)边是否存在 14 15 void putEdge(EdgeElement thEdge); // 插入一条边 16 17 void removeEdge(int i, int j); // 删除一条(i, j)边 18 19 int degree(int i); 20 21 int inDegree(int i); // 返回顶点i的入度 22 23 int outDegree(int i); // 返回顶点i的出度 24 25 void output(); // 输出 26 27 void depthFirstSearch(int v); // 从v开始深度优先 28 29 void breadthFirstSearch(int v); // 从v开始广度优先 30 }
先贴下源码,下次给注解。。。