2014-03-26 46 views
0

我看過jgraph和jgrapht的例子,那裏很容易遵循,但現在肯定我將如何去使用CompleteBipartiteGraph?如何使用語法來實例化圖形?Java JGrapht二分圖

http://jgrapht.org/javadoc/

http://jgrapht.org/javadoc/org/jgrapht/generate/CompleteBipartiteGraphGenerator.html

+0

它看起來是非常簡單易用。 (當然,這種印象可能是錯誤的,但是)似乎你只是創建了這個生成器的一個實例,然後用一個(最初是空的)圖來調用'generateGraph',它接收由給定的創建的頂點和邊工廠。你能否指出你到目前爲止所嘗試的以及你卡在哪裏? – Marco13

+0

讓我問你這個。我有一個列表,每個頂點和相應的頂點到相應的頂點。所以圖的一邊應該有多條線到右邊的多個頂點。這個概念和結構是否適合繪製二分圖?我應該使用什麼數據結構,數組列表?所以它看起來像這樣..... V - > V1,V2,V3。 – MAXGEN

+0

我不明白你的問題。使用帶有參數(5,3)的該生成器應該創建一個完整的二部圖,如示例(右上圖),位於http://en.wikipedia.org/wiki/Complete_bipartite_graph ... – Marco13

回答

1

在回答這個問題「我仍然可以使用這種生成?」來自評論:您仍然可以使用它來創建完整的二分圖,然後隨機刪除一些邊。

但是更直接的方法是簡單地生成兩組頂點並在它們之間插入一些隨機邊。事實上,這是所以很容易,我假設還有額外的約束,你直到現在還沒有提到。我插在那裏確信,二分圖中不包含孤立點的另一種方法(我的水晶球說是這樣做的......)

import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

import org.jgrapht.Graph; 
import org.jgrapht.UndirectedGraph; 
import org.jgrapht.VertexFactory; 
import org.jgrapht.graph.DefaultEdge; 
import org.jgrapht.graph.SimpleGraph; 

public class BipartiteGraphTest 
{ 
    public static void main(String[] args) 
    { 
     UndirectedGraph<String, DefaultEdge> graph = 
      new SimpleGraph<String, DefaultEdge>(DefaultEdge.class); 

     VertexFactory<String> vertexFactory = new VertexFactory<String>() 
     { 
      int n = 0; 
      @Override 
      public String createVertex() 
      { 
       String s = String.valueOf(n); 
       n++; 
       return s; 
      } 
     }; 
     int numVertices0 = 10; 
     int numVertices1 = 15; 
     int numEdges = 20; 
     generateGraph(graph, numVertices0, numVertices1, numEdges, vertexFactory); 

     System.out.println(graph); 
    } 

    // Creates a bipartite graph with the given numbers 
    // of vertices and edges 
    public static <V, E> void generateGraph(Graph<V, E> graph, 
     int numVertices0, int numVertices1, int numEdges, 
     final VertexFactory<V> vertexFactory) 
    { 
     List<V> vertices0 = new ArrayList<V>(); 
     for (int i = 0; i < numVertices0; i++) 
     { 
      V v = vertexFactory.createVertex(); 
      graph.addVertex(v); 
      vertices0.add(v); 
     } 
     List<V> vertices1 = new ArrayList<V>(); 
     for (int i = 0; i < numVertices1; i++) 
     { 
      V v = vertexFactory.createVertex(); 
      graph.addVertex(v); 
      vertices1.add(v); 
     } 

     // Create edges between random vertices 
     Random random = new Random(0); 
     while (graph.edgeSet().size() < numEdges) 
     { 
      int i1 = random.nextInt(vertices1.size()); 
      V v1 = vertices1.get(i1); 
      int i0 = random.nextInt(vertices0.size()); 
      V v0 = vertices0.get(i0); 
      graph.addEdge(v0, v1); 
     } 

    } 

    // Creates a bipartite graph with the given numbers 
    // of vertices and edges without isolated vertices 
    public static <V, E> void generateGraphNoIsolatedVertices(
     Graph<V, E> graph, int numVertices0, int numVertices1, int numEdges, 
     final VertexFactory<V> vertexFactory, 
     List<V> vertices0, List<V> vertices1) 
    { 
     int minNumEdges = Math.max(numVertices0, numVertices0); 
     if (numEdges < minNumEdges) 
     { 
      System.out.println("At least " + minNumEdges + " are required to " + 
       "connect each of the " + numVertices0 + " vertices " + 
       "to any of the " + numVertices1 + " vertices"); 
      numEdges = minNumEdges; 
     } 

     for (int i = 0; i < numVertices0; i++) 
     { 
      V v = vertexFactory.createVertex(); 
      graph.addVertex(v); 
      vertices0.add(v); 
     } 
     for (int i = 0; i < numVertices1; i++) 
     { 
      V v = vertexFactory.createVertex(); 
      graph.addVertex(v); 
      vertices1.add(v); 
     } 

     // Connect each vertex of the larger set with 
     // a random vertex of the smaller set 
     Random random = new Random(0); 
     List<V> larger = null; 
     List<V> smaller = null; 


     if (numVertices0 > numVertices1) 
     { 
      larger = new ArrayList<V>(vertices0); 
      smaller = new ArrayList<V>(vertices1); 
     } 
     else 
     { 
      larger = new ArrayList<V>(vertices1); 
      smaller = new ArrayList<V>(vertices0); 
     } 
     List<V> unmatched = new ArrayList<V>(smaller); 
     for (V vL : larger) 
     { 
      int i = random.nextInt(unmatched.size()); 
      V vS = unmatched.get(i); 
      unmatched.remove(i); 
      if (unmatched.size() == 0) 
      { 
       unmatched = new ArrayList<V>(smaller); 
      } 
      graph.addEdge(vL, vS); 
     } 

     // Create the remaining edges between random vertices 
     while (graph.edgeSet().size() < numEdges) 
     { 
      int i0 = random.nextInt(vertices0.size()); 
      V v0 = vertices0.get(i0); 
      int i1 = random.nextInt(vertices1.size()); 
      V v1 = vertices1.get(i1); 
      graph.addEdge(v0, v1); 
     } 

    } 


} 
+0

謝謝。我要去解決這個問題。它是一個使用庫的直接方法,可能是我將要使用的。我正在解析一個藥物庫,並且使得藥物IDS中的字符串顯示了其他酶之間的關係,它們也有字符串。所以圖形沒有字符串比較我是否必須自己做,然後像你的做法迭代,並做出頂點和邊緣? – MAXGEN

+0

@MAXGEN如果這是一個問題,你應該嘗試重寫它,至少,我不明白它 – Marco13

+0

我打開另一個問題,如果你可以幫助,它可能會更有意義。https://stackoverflow.com/questions/22703918/java-jgraph-applet-visualize-bipartite-graph – MAXGEN