簡體   English   中英

如何在完整圖的每條邊上迭代一次?

[英]How to iterate over each edge of a complete graph exactly once?

我想設置完整圖中所有邊的權重([a][b] = [b][a] = 隨機整數)。 為此,我編寫了這段代碼:

for (i = 0; i < n; i++)
{
    for (int j = 1; j < n; j++)
    {
        if (i != j)
        {
            w = std::rand() % 58 + 3;
            cout << i << ":" << j << " weight " << w << endl;
            graph[i][j] = graph[j][i] = w;
        }
    }
}

這里, n是頂點數。 不幸的是,這不是我想要的。 我試圖為每條邊分配一個權重,但此代碼為大多數邊分配了兩個權重。 例如,這是上述代碼的示例輸出,其中n = 4:

0:1
0:2
0:3
1:2
1:3
2:1
2:3
3:1
3:2

請注意,0:3 和 3:0 均已列出,因此邊上將有兩個不同的權重。 我只想列出這些邊:

0:1
0:2
0:3
1:2
1:3
2:3

我怎樣才能做到這一點?

做你想做的事情的標准方法 - 在沒有任何重復的情況下迭代所有對 - 是像這樣更改 for 循環上的索引:

for (i = 0; i < n; i++)
{
    for (int j = i + 1; j < n; j++) // <--- Change here
    {
         ...
    }
}

這將正確地在所有不同節點對上循環一次。 它通過強制該對的第一個分量小於第二個分量來實現。

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM