2013-02-08 64 views
0

我正在嘗試使用不相交集編寫Kruskal算法的實現。我認爲我已經接近工作了,但我似乎無法讓代碼正確工作。代碼需要檢查圖上的一個節點是否已經在它試圖添加的集合中;否則,你不想添加它。這裏是我正在使用的代碼:不相交集問題

public static boolean difSets(int index1, int index2, ArrayList<Node> sets[], Node nodes[]) 
{ 
    int setnum1 = 0; 
    int setnum2 = 0; 
    for(int i = 0; i < nodes.length; i++) 
    { 
     for(int j = 0; j < sets[i].size(); j++) 
     { 
      if(nodes[index1].getX() == sets[i].get(j).getX() && nodes[index1].getY() == sets[i].get(j).getY()); 
       setnum1 = i; 
      if(nodes[index2].getX() == sets[i].get(j).getX() && nodes[index2].getY() == sets[i].get(j).getY()); 
       setnum2 = i; 
     } 
    } 
    if(setnum1 == setnum2) 
     return false; 
    else 
     return true; 
} 

有點信息:這個方法是確定兩個節點是否已經在同一個集合中。節點數組包含圖上的所有點(Node是一個只存儲x值和y值的類,並且可以檢索它們)Sets是由ArrayLists節點組成的數組,在問題開始時,每個節點都將處於一個ArrayList本身;最後,它們應該全部在同一個ArrayList中,索引1和2對應於Nodes數組中的節點。我一直在它提前一個凝視一個多小時,我無法弄清楚的問題是什麼,所以我希望這裏有人可以幫助我。

感謝。

+0

也許我會重構這個使用http://docs.oracle.com/javase/6/docs/api/java/util/Set.html – Luis

+0

從你的代碼我明白,長度的nodes數組總是與sets數組中的一個相同。當你開始合併集會發生什麼,不應該減少集數組的大小? – Bogdan

+0

我剛剛在空格中留下了空集,而不是縮小它。循環只是忽略它,因爲.size()返回0.回想起來,這可能是複雜實現不相交集的一種方式。 – gmaster

回答

0

解決它。 java中很多東西的模擬對我來說,它是沒有意義的。

public static boolean difSets(int index1, int index2, ArrayList<Node> sets[], Node nodes[]) 
{ 
    int setnum1 = 0; 
    int setnum2 = 0; 
    int x1 = nodes[index1].getX(); 
    int y1 = nodes[index1].getY(); 
    int x2 = nodes[index2].getX(); 
    int y2 = nodes[index2].getY(); 
    for(int i = 0; i < nodes.length; i++) 
    { 
     for(int j = 0; j < sets[i].size(); j++) 
     { 
      int x3 = sets[i].get(j).getX(); 
      int y3 = sets[i].get(j).getY(); 
      if(x1 == x3 && y1 == y3) 
       setnum1 = i; 
      if(x2 == x3 && y2 == y3) 
       setnum2 = i; 
     } 
    } 
    if(setnum1 == setnum2) 
     return false; 
    else 
     return true; 
} 

這實際上應該與我以前的完全一樣。儘管如此...

+0

我不知道你的'Node'類是什麼樣的,但我猜'getX()'和'getY()'返回整型''。如果是這種情況,則第9行和第11行中的「==」測試引用相等而不是值相等。在這種情況下,您可以使用equals方法,或者像在此解決方案中一樣,在與int相比較的每次比較中至少取一個值。 – Jakob