我必须做一个总共会生成30个图形的程序,其中5个具有10个独特边缘,5个具有20个独特边缘,等等达到60个。然后,我必须在每个图形中获取平均数量的组件。 5个图表。但是,我的节目一直挂在同一个地方。正是在它试图完成第16个图形和第11个边缘时,它始终是失败的。我忽略了连接组件静态方法,因为这与问题无关,我相信。请注意,这是早期优化副本的草稿,两者都挂在同一个地方。
首先,我创建一个图表,其中需要26个顶点,然后将相同的图形放入数组中的30个点中,然后将唯一边放入每个图中。
edgeIs方法和indexIs方法在我正在使用的ADT图中。
以下是代码:
import ch05.queues.LinkedUnbndQueue;
import ch05.queues.UnboundedQueueInterface;
import java.util.Random;
public class UniqueEdgeGraph2 {
public static void main (String[] args) {
final int numGraphs2 = 5;
int numEdges = 10;
double sum = 0;
int index = 0;
Random rand = new Random();
int randomNum1 = 0, randomNum2 = 0, flag = 0;
UnweightedGraph<Integer>[] graphArray = (UnweightedGraph<Integer>[]) new UnweightedGraph[30];
UnweightedGraph<Integer> graph;
for (int i = 0; i < 30; i++)
graphArray[i] = new UnweightedGraph<Integer>();
for (int i = 0; i < 30; i++)
for (int j = 0; j < 26; j++)
graphArray[i].addVertex(j);
for (int i = 0; i < 6; i++) { // it is done 6 times because 30 graphs are needed in total and numGraphs is 5
for (int j = 0; j < numGraphs2; j++) {
for (int k = 0; k < numEdges; k++) {
while (flag == 0) {
randomNum1 = rand.nextInt(26);
randomNum2 = rand.nextInt(26);
if (graphArray[index].edgeIs(randomNum1, randomNum2) == false) {
graphArray[index].addEdge(randomNum1, randomNum2);
flag = 1;
}
}
flag = 0;
}
sum += CountConnectedComponents(graphArray[index]);
index++;
}
System.out.println("Average # of Connected Components for five graphs with " + numEdges + " unique edges is: "
+ sum/5.0);
sum = 0;
numEdges += 10;
}
}
public boolean edgeIs(T fromVertex, T toVertex)
// If edge from fromVertex to toVertex exists, returns true
// otherwise, returns false.
{
int row;
int column;
row = indexIs(fromVertex);
column = indexIs(toVertex);
return (edges[row][column]);
}
private int indexIs(T vertex)
// Returns the index of vertex in vertices.
{
int index = 0;
while (!vertex.equals(vertices[index]))
index++;
return index;
}
答案 0 :(得分:0)
我弄清楚错误是什么。我指的是所有30个数组索引的相同图形。因此,我没有制作30个不同的图形,而是将整个数组指向一个图形。这使得最终无法找到一个独特的边缘,这导致了无限循环,而不是像我想象的那样悬挂。
我编辑了代码以反映我为使其工作所做的更改。它仍然是粗糙的形状,但它只需要清理。
感谢所有评论的人。