[英]Build a graph with the biggest distance (edges) between two nodes is equal than two
我必須使用 Python 構建算法:
n
個節點的情況下具有最少可能的邊數。 函數簽名可以是createGraph(n: int,forbidenEdge: list[int]) -> list[int]
一個例子: n = 4
, forbidenEdge = [[1,3]]
該函數返回必須構建的邊,因此我們在圖中有最少數量的邊。
對於給定的示例,我們有以下可能的輸出(有時我們可以有多個輸出): [[1, 2],[4, 2],[2, 3]]
我不確定我正在考慮實施的解決方案是否正確。
如果我們沒有任何限制,或者如果至少有一個節點可以連接到任何節點,則最小邊數等於 (n - 1)。 我們可以選擇一個可以連接到所有其他節點的節點。 問題是沒有節點可以連接到所有其他節點。 為此,我正在考慮創建以下算法,但我不確定它是否正確。 對於這種情況,我正在考慮以下算法:
我們必須檢查每個節點可以做的連接數,並根據這個數字在列表中對它們進行排序。 我們必須檢查無法連接到節點中心的節點是否能夠連接到所有其他節點(如果可能,我們連接可以連接到節點中心的節點和我們連接的其他節點彼此...我們打印連接)如果不可能我們必須選擇另一個節點中心,即排序列表中的下一個。 We repeat it until we find a node center that when chosen is going be possible to build edges between the nodes in a way that from any node we can move to another node passing through two edges only.
對於這個算法,如果我們有n = 4
, forbidenEdge = [[1,3],[2,4]]
...節點 3 可以是節點中心。 節點 1 無法連接到節點中心,因此它連接到所有其他節點。 所以我們有輸出: [[1,2],[1,4],[2,3],[3,4]]
。
該算法是否適用於任何n
和任何forbidenEdge
列表? 我怎么證明呢?
TLDR:您可以根據連接矩陣與自身的點積來計算雙邊跳躍的數量。 單邊跳躍的次數就是連接矩陣。
不是解決方案,而是一些注意事項,我希望對您的搜索仍然有幫助:
考慮您有一個連接矩陣(每個節點一列和一行,如果節點之間有邊則為1
,否則為0
)。 例如,對於禁止邊[[1, 2], [3, 4]
和n = 4
,連接矩陣如下所示:
[
[0, 0, 1, 1],
[0, 0, 1, 1],
[1, 1, 0, 0],
[1, 1, 0, 0]
]
然后你已經通過連接矩陣本身知道了兩個節點之間單邊跳躍的數量(到目前為止是微不足道的)。 但更有趣的是,您可以通過連接矩陣與自身的點積來計算兩個節點之間的雙邊跳躍次數,這個想法是。 點積基本上計算兩個節點之間的共同鄰居。
現在的目標基本上是,刪除邊緣(在連接矩陣中將數字設置為零)直到不能再刪除為止。 算法可能如下所示:
0
的連接矩陣cm
(節點從不直接連接到自身,即使允許這樣做,當目標是邊數最少時,邊將被修剪,因為它不會添加任何有用的連接到圖表)。0
。numpy.dot(cm, cm)
)。對於第 6 步,我有一些想法,可以通過對 numpy 數組進行過濾來實現。
所以不幸的是,這並不能解決您的問題,但也許您或其他人可以在此基礎上進行構建或從中獲得啟發。 可能有更多的數學原理可以利用,比如計算點積的兩步跳躍次數。 然后結合快速的 numpy 實現,一種智能的蠻力方法是可能的(當然取決於最大節點數)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.