關於無向圖的最大團的問題。


今天觀摩別人代碼的時候,出現了求無向圖最大團。

描述:團就是最大完全子圖。(極大團)

給定無向圖G=(V,E)。如果U包含於V,且對任意u,v屬於U且有(u,v)屬於E,則稱U是G的完全子圖。

G的完全子圖U是G的團當且僅當U不包含在G的更大的完全子圖中,即U就是最大完全子圖。

G的最大團是指G中所含頂點數最多的團。(團中的頂點兩兩互連

// 最大團: V中取K個頂點,兩點間相互連接

// 最大獨立集: V中取K個頂點,兩點間不連接 

// 最大團數量: 補圖中最大獨立集數

 

在看最大團,學習api的過程中,看到一個很有趣的問題:n個漢字兩兩組成常見詞語,求n的最大值,任意兩個字只要能組成一個常用詞語就行,不需要正反都能組成詞語。

解答:

作者:王贇 Maigo
鏈接:https://www.zhihu.com/question/50112280/answer/119428441
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

原問題可以抽象成一個圖論問題:把每個漢字看成無向圖中的一個頂點,若兩個字可以組成詞,則在兩個點之間連一條邊,求圖中最大的「團」(clique,即頂點全部兩兩相連的子圖)。

首先,構造圖的數據從哪兒來呢?我從網上找了一個《現代漢語常用詞匯表》,用其中的所有雙字詞建了一個圖。

然后,就要找圖中的團了。不幸的是,Clique problem是一個NP-complete問題,無法在多項式時間內求解。但是,我們的圖有它的特殊性,即里面不太可能有很大的團。為何不試試運氣呢?而且算法都不需要我親手實現,有現成的庫可以用:
Clique — NetworkX 1.9.1 documentation

代碼如下:
# -*- coding: utf-8 -*- import codecs import networkx as nx DICT_FILE = u'現代漢語常用詞匯表.txt' G = nx.Graph() with codecs.open(DICT_FILE, 'r', encoding = 'utf-8') as f: for line in f: if len(line.strip()) == 2: G.add_edge(line[0], line[1]) cliques = list(nx.find_cliques(G)) N = max(len(c) for c in cliques) for c in sorted(''.join(sorted(c)) for c in cliques if len(c) == N): print c

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM