此代码创建一个随机边缘的随机“图形”,但在某些情况下,这部分代码:
for(int i=0;i<k;i++) {
int numero2 = (int) (Math.random() * k);
int numero3 = (int) (Math.random() * k);
g.addEdge(numero2, numero3 );
}
不会避免在节点之间创建两个或三个边缘,这是错误的,因为它不模拟常规图形。我应该在代码中添加什么样的条件,以便完全避免在两个顶点之间创建多个边?
提前致谢。特别是如果有答案或更好,那么我的问题就是一个很好的答案。
完整的代码是:
import java.util.*;
import java.util.Random;
class Graph{
class Edge{
int v;
public Edge(int v){
this.v=v;
}
@Override
public String toString(){
return "("+v+")";
}
}
List<Edge> G[];
public Graph(int n){
G=new LinkedList[n];
for(int i=0;i<G.length;i++)
G[i]=new LinkedList<Edge>();
}
void addEdge(int u,int v){
G[u].add(0,new Edge(v));
}
@Override
public String toString(){
String result="";
for(int i=0;i<G.length;i++)
result+=i+"=>"+G[i]+"\n";
return result;
}
}
public class Graph01 {
public static void main(String[] args) {
int k = (int) (Math.random() * 5) + 5;
Graph g;
g = new Graph(k);
for(int i=0;i<k;i++) {
int numero2 = (int) (Math.random() * k);
int numero3 = (int) (Math.random() * k);
g.addEdge(numero2, numero3 );
}
System.out.println(g);
}
}
答案 0 :(得分:2)
有三种可能性:
n
传出边缘,其中n
符合您的喜好。 在选项3中,如果您的边缘未被定向,或者您想要避免距离-1周期(A-> B和B-> A),则问题稍微复杂一些,但仍然可以轻松解决。
这些选项都不会生成没有距离大于1的周期的图。这样做需要更复杂的编码。