![](/img/trans.png)
[英]Efficient way to iterate over each key exactly once in unordered_multimap
[英]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.