// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea
// Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com
// Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology
// Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/
package graphtea.extensions.reports.basicreports;
import graphtea.graph.graph.GraphModel;
import graphtea.platform.lang.CommandAttitude;
import graphtea.plugins.main.core.AlgorithmUtils;
import graphtea.plugins.reports.extension.GraphReportExtension;
import java.util.ArrayList;
import java.util.List;
/**
* @author Mohammad Ali Rostami
*/
@CommandAttitude(name = "girth_size", abbreviation = "_gs")
public class GirthSize implements GraphReportExtension {
private static int bfs(int start, double mat[][], int cc, int girth) {
int baba[] = new int[cc];
int dist[] = new int[cc];
for (int i = 0; i < cc; i++) {
baba[i] = AlgorithmUtils.Max_Int;
dist[i] = AlgorithmUtils.Max_Int;
}
dist[start] = 0;
baba[start] = -1;
List<Integer> ll = new ArrayList<>();
ll.add(start);
while (ll.size() > 0) {
int currentNode = ll.remove(0);
for (int j = 0; j < cc; j++)
if (mat[currentNode][j] == 1)
if (dist[j] == AlgorithmUtils.Max_Int) {
dist[j] = dist[currentNode] + 1;
baba[j] = currentNode;
if (2 * dist[j] < girth - 1)
ll.add(j);
} else if (dist[j] + dist[currentNode] < girth - 1 && baba[currentNode] != j)
girth = dist[j] + dist[currentNode] + 1;
}
return girth;
}
public Object calculate(GraphModel g) {
return getGirthSize(g);
}
/**
* @return the girth size of the given graph
*/
private static int getGirthSize(GraphModel graph) {
int size = graph.getVertexArray().length;
double mat[][] = graph.getAdjacencyMatrix().getArray();
int girth = AlgorithmUtils.Max_Int;
for (int i = 0; i < size; i++) {
int sizeofsmallestcycle = bfs(i, mat, size, girth);
if (sizeofsmallestcycle != AlgorithmUtils.Max_Int && girth > sizeofsmallestcycle)
girth = sizeofsmallestcycle;
}
if (girth == AlgorithmUtils.Max_Int) return 0;
return girth;
}
public String getName() {
return "Graph Girth Size";
}
public String getDescription() {
return "Graph Girth Size";
}
@Override
public String getCategory() {
// TODO Auto-generated method stub
return "General";
}
}