簡體   English   中英

構建兩個節點之間的最大距離(邊)等於二的圖

[英]Build a graph with the biggest distance (edges) between two nodes is equal than two

我必須使用 Python 構建算法:

  1. 該算法必須構建一個圖,該圖在給定n個節點的情況下具有最少可能的邊數。
  2. 我們必須最多使用兩條邊從一個節點轉到另一個節點。
  3. 有些節點不能彼此相鄰。
  4. 保證對於給定的輸入,我們將能夠找到滿足上述三項的解決方案。

函數簽名可以是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 = 4forbidenEdge = [[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]
]

然后你已經通過連接矩陣本身知道了兩個節點之間單邊跳躍的數量(到目前為止是微不足道的)。 但更有趣的是,您可以通過連接矩陣與自身的點積來計算兩個節點之間的雙邊跳躍次數,這個想法是。 點積基本上計算兩個節點之間的共同鄰居。

現在的目標基本上是,刪除邊緣(在連接矩陣中將數字設置為零)直到不能再刪除為止。 算法可能如下所示:

  1. 將對角線初始化為0的連接矩陣cm (節點從不直接連接到自身,即使允許這樣做,當目標是邊數最少時,邊將被修剪,因為它不會添加任何有用的連接到圖表)。
  2. 在連接矩陣中將禁止邊的所有節點對設置為0
  3. 計算雙邊跳躍的次數 ( numpy.dot(cm, cm) )。
  4. 通過添加單邊跳躍(連接矩陣)和雙邊跳躍(在步驟 3 中計算)來計算節點之間的路徑總數。
  5. 如果第 4 步計算出的矩陣中的任何數字為 0,則連接矩陣無效,如果在第一次迭代中發生這種情況,則問題無法解決,或者最后刪除的邊使連接矩陣無效(如果正確實施,則不應發生) ).
  6. 現在是困難的部分,選擇一個節點對從連接矩陣中刪除並重復步驟 3-6,直到不能刪除更多的邊。

對於第 6 步,我有一些想法,可以通過對 numpy 數組進行過濾來實現。

  1. 顯然,您只能刪除有邊開始的邊(連接矩陣中的 1)。
  2. 您只能刪除邊緣,其中在 4 中計算的矩陣至少為 2。否則您將刪除最后一個連接。
  3. 您不能刪除邊,它是未直接連接的節點對的雙邊跳轉的最后一個連接。 我還沒有找到直接檢查的東西。

所以不幸的是,這並不能解決您的問題,但也許您或其他人可以在此基礎上進行構建或從中獲得啟發。 可能有更多的數學原理可以利用,比如計算點積的兩步跳躍次數。 然后結合快速的 numpy 實現,一種智能的蠻力方法是可能的(當然取決於最大節點數)。

暫無
暫無

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

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