2010-06-11 51 views
2

我奮力解決以下問題中的圖形問題

http://uva.onlinejudge.org/external/1/193.html

但是我不是能得到一個快速的解決方案。

被別人的時候所看到,應該有最大的N^2的複雜性的解決方案

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problemid=129&page=problem_stats

我能得到一些幫助?

+0

你有多遠?你寫了什麼樣的代碼? – Sev 2010-06-11 06:07:35

+1

這個問題是NP完成的,我認爲所有這些都通過了優化的bruteforces或錯誤的貪婪。 – 2010-06-11 06:10:37

+0

@Sev 我在所有的頂點組合上做了蠻力,並且在每一步中找到了一個大小爲x的團。然後我刪除了不屬於這個的所有頂點。然後我對剩下的頂點用x + 1的團體做了蠻力。這一直持續到沒有大小爲x的團體。顯然這太慢了。 – copperhead 2010-06-11 06:41:24

回答

1

您只能以指數複雜度解決這個問題,但這並不像聽起來那麼糟糕,因爲在實踐中,您將能夠避免很多錯誤的決策,從而顯着減少算法的運行時間。

簡而言之,您必須從節點運行DF搜索,並儘量爲儘可能多的黑色節點着色。如果您位於具有相鄰黑節點的節點上,則該節點只能是白色。繼續爲着色特定節點的每一種可能性做這件事。

如果您無法弄清楚,請查看我通過使用Google搜索問題名稱找到的這兩個代碼片段:onetwo。作者說他們得到AC,但我沒有測試它們。然而他們看起來正確。

0

它正在解決稱爲最大團的問題,也稱爲最大獨立集或最大穩定集。這是NP-Complete。我知道的最小的代碼是Cliquer:http://users.tkk.fi/pat/cliquer.html

如果你正在爲教育目的而自己編寫自己的代碼,那麼一次深度優先搜索染色節點黑色並退回DFS(如果兩個黑色節點觸摸。

最簡單的代碼解決方案是實現一個二進制計數器並嘗試所有2^n個可能性。

+0

全部2^n個可能性? - 2^100會很難受到傷害:) – 2010-06-11 07:35:26

+0

dfs的複雜程度如何? – copperhead 2010-06-11 07:35:30

+0

@copperhead - 它在理論上也是'O(2^n)',但它在實踐中的運行速度會快得多,因爲您可以快速消除大量無效的解決方案。如果你這樣做,你一定會得到AC。 – IVlad 2010-06-11 08:21:19

0

Bron–Kerbosch algorithm

我已經解決了在Facebook上的難題類似的問題,我用在B-K算法中了點。

+0

僞代碼中的'\'是什麼意思?(P \ N(u)) – copperhead 2010-06-11 07:58:22

+0

這意味着集合P沒有N(u) – 2010-06-11 08:00:56

+0

我找到了一個示例代碼(ruby):http://kanwei.com/代碼/ 2009/03/26/facebook-peaktraffic.html – zengr 2010-06-11 08:02:40