implementato connected components

This commit is contained in:
2014-06-01 18:47:19 +02:00
parent e53f98a3a8
commit 71cea16bcb
2 changed files with 73 additions and 82 deletions

View File

@@ -1,82 +0,0 @@
package test_2_prova_intercorso;
import exceptions.InvalidKeyException;
import graph.ComponentsBFS;
import graph.Edge;
import graph.Graph;
import graph.Vertex;
import partition.ListPartition;
import partition.Partition;
import position.NodePositionList;
/**
* Created with MONSTER.
* User: xgiovio
* Date: 01/06/2014
* Time: 17:32
*/
public class General {
public static <V,E> Partition<Vertex<V>> findConnectedComponentsl(Graph<V,E> G){
Partition<Vertex<V>> p = new ListPartition<Vertex<V>>();
Object VISITED = new Object();
Object UNVISITED = new Object();
Object STATUS =
for (Vertex<V> v : G.vertices()) {
v.put()
}
layers.add(0, new NodePositionList<Vertex<V>>());
layers.get(0).addLast(v);
}
int i = 0;
while (!layers.get(i).isEmpty()) {
layers.add(i + 1, new NodePositionList<Vertex<V>>());
for (Vertex<V> vertexInLayer : layers.get(i)) {
for (Edge<E> e : graph.incidentEdges(vertexInLayer)) {
if (!isVisited(e)) {
visit(e);
Vertex<V> w = graph.opposite(vertexInLayer, e);
if (!isVisited(w)) {
traverseDiscovery(e, vertexInLayer);
if (isDone())
break;
visit(w);
layers.get(i + 1).addLast(w);
if (isDone())
break;
} else {
traverseCross(e, v);
if (isDone())
break;
}
}
}
if (!isDone())
finishVisit(vertexInLayer);
}
i++;
}
return result();
}
}
}

View File

@@ -0,0 +1,73 @@
package test_2_prova_intercorso;
import arraylist.ArrayIndexList;
import arraylist.IndexList;
import exceptions.InvalidKeyException;
import graph.ComponentsBFS;
import graph.Edge;
import graph.Graph;
import graph.Vertex;
import partition.ListPartition;
import partition.Partition;
import position.NodePositionList;
import position.PositionList;
import set.Set;
/**
* Created with MONSTER.
* User: xgiovio
* Date: 01/06/2014
* Time: 17:32
*/
public class Other_Functions {
public static <V,E> Partition<Vertex<V>> findConnectedComponents(Graph<V,E> G) {
Partition<Vertex<V>> p = new ListPartition<Vertex<V>>();
Object VISITED = new Object();
Object UNVISITED = new Object();
Object STATUS = new Object();
for (Vertex<V> v : G.vertices()) {
v.put(STATUS, UNVISITED);
}
for (Vertex<V> v : G.vertices()) {
if (v.get(STATUS).equals(UNVISITED)) {
IndexList<PositionList<Vertex<V>>> layers = new ArrayIndexList<PositionList<Vertex<V>>>();
layers.add(0, new NodePositionList<Vertex<V>>());
layers.get(0).addLast(v);
v.put(STATUS, VISITED);
Set<Vertex<V>> s = p.makeSet(v);
int i = 0;
while (!layers.get(i).isEmpty()) {
layers.add(i + 1, new NodePositionList<Vertex<V>>());
for (Vertex<V> vertexInLayer : layers.get(i)) {
for (Edge<E> e : G.incidentEdges(vertexInLayer)) {
if (e.get(STATUS).equals(UNVISITED)) {
e.put(STATUS, VISITED);
Vertex<V> w = G.opposite(vertexInLayer, e);
if (w.get(STATUS).equals(UNVISITED)) {
w.put(STATUS, VISITED);
p.union(s, p.makeSet(w));
layers.get(i + 1).addLast(w);
}
}
}
}
i++;
}
}
}
return p;
}
}