繁体   English   中英

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

[英]Avoid creating more than one edge between vertices (java.util, linkedList, Graph)

这段代码正在创建带有随机边的随机“图形”,但是在某些情况下,这部分代码是:

 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. 产生随机边缘; 如果存在该边缘,则生成另一边缘; 重复直到拥有所有想要的边缘
  2. 事先枚举所有可能的边; 从该集合中随机选择边,并在您“使用”它们时将其从集合中删除。
  3. 一次遍历所有节点,生成n 传出边,其中n是您喜欢的。

在选项3中,如果您的边缘未对准,或者您想要避免距离1循环(A-> B和B-> A),则问题会稍微复杂一些,但仍可轻松解决。

这些选项均不能生成无周期且距离大于1的图形。这样做将需要更复杂的编码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM