避免在顶点之间创建多个边(java.util,linkedList,Graph)

时间:2017-08-25 05:16:40

标签: java

此代码创建一个随机边缘的随机“图形”,但在某些情况下,这部分代码:

 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);


        }
}

1 个答案:

答案 0 :(得分:2)

有三种可能性:

  1. 生成随机边缘;如果存在该边缘则产生不同的边缘;重复,直到你拥有所需的所有边缘
  2. 提前列举所有可能的边缘;从该集合中随机选择边缘,在“使用”它们时将它们从集合中移除。
  3. 一次一个地迭代所有节点,生成n 传出边缘,其中n符合您的喜好。
  4. 在选项3中,如果您的边缘未被定向,或者您想要避免距离-1周期(A-> B和B-> A),则问题稍微复杂一些,但仍然可以轻松解决。

    这些选项都不会生成没有距离大于1的周期的图。这样做需要更复杂的编码。