【问题标题】:Avoid creating more than one edge between vertices (java.util, linkedList, Graph)避免在顶点之间创建多个边(java.util、linkedList、Graph)
【发布时间】:2017-08-25 05:16:39
【问题描述】:

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

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


        }
}

【问题讨论】:

  • 与您的问题无关,但存在图形库,因此您无需重新发明轮子。例如JGraphT.

标签: java


【解决方案1】:

有三种可能:

  1. 生成随机边;如果该边缘存在,则生成不同的边缘;重复直到你拥有所有你想要的边缘
  2. 提前枚举所有可能的边;从该集合中随机选择边,在您“使用”它们时将它们从集合中移除。
  3. 遍历所有节点,一次一个,生成n 传出 边缘,n 符合您的喜好。

在选项 3 中,如果您的边没有定向,或者您想避免距离为 1 的循环(A->B 和 B->A),那么问题会稍微复杂一些,但仍然很容易解决。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    相关资源
    最近更新 更多