最大團問題例項 部落衛隊問題實現

2021-06-14 06:10:34 字數 1393 閱讀 6615

首先介紹下最大團問題:

問題描述:給乙個無向圖g=(v,e) ,v是頂點集合,e是邊集合。然後在這頂點集合中選取幾個頂點,這幾

個頂點任意兩個之間都有邊在e中。求最多可以選取的頂點個數。這幾個頂點就構成乙個最大團。

注:最大團可能不唯一。

問題求解思想:這個問題的本質是乙個子集選取問題,就是有集合包括n個元素選取其中乙個子

集,這個子集滿足某種性質(對於最大團問題,就是任意兩個頂點之間有邊),求這個子集的最大元素數。

每個元素(對應頂點編號)有2種選擇,加入或不加入。所以子集個數為2^n個。

這裡用回溯的思想求解。

回溯的概念如是理解:在包含所有問題的所有解的解空間樹中,從根節點進行深度優先搜尋,搜尋空間樹中

的任一節點的時候,首先判斷是否可能包含最優解,如果不包含,就跳過改節點為根的子樹的搜尋,向其上

一層祖先節點回溯。入包含,則進入該子樹,進行深度優先搜尋。

部落衛隊問題描述:

原始部落中的居民為了爭奪資源,常發生衝突。幾乎每個居民都有仇敵。酋長為了組織乙個部落衛隊,希望

從部落居民中選出最多的居民入伍,並保證隊伍中任何2個人都不是仇敵。

程式設計任務:

根據給定的居民間的仇敵關係,程式設計計算出部落衛隊的最佳方案。

資料輸入:

第1行2個整數n,m表示部落中居民個數,居民中有m個仇敵關係。居民編號1,2,...,n。接下來m行,每行2

個整數u,v表示居民u和v是仇敵。

資料輸出:

第1行是最佳方案中部落衛隊的人數,第2行是衛隊組成xi, 1=**實現:

coder:huifeng00 at 2010-6-30 12:00

#include

using namespace std;

int graph[200][200];//鄰接矩陣儲存無向圖

int ans[200];//儲存最優解,0表示不在團,1表示在團

int temp[200];//記錄搜尋中各個頂點的狀態

int bestn = 0;//儲存最大團頂點數

int cn = 0;//記錄搜尋中團的頂點數

int n;//圖的頂點數

void go(int i)//搜尋過程,其實就是深度優先搜尋加回溯

return ;

}int j,ok=1;

for (j=0;jif (cn+n-i-1>bestn)

}int main()

go(0);

cout《輸入例項:

7 10

1 21 4

2 42 3

2 52 6

3 53 6

4 55 6

輸出例項:

31 0 1 0 0 0 1

注意:這裡認為是仇敵則對應的圖的鄰接矩陣值為0,表示沒有邊連線。

最大團問題

include cstdio include queue include cstring define max 20 using namespace std int n 城市數量 int x max 解向量 struct node priority queuepq void enqueue int ...

最大團問題

最大團問題 首先介紹一些基本概念 1 什麼是團?如果乙個子圖是乙個無向圖的完全子圖,那麼可以稱為乙個團。2 什麼是極大團?如果乙個團不是任何乙個團的子集,那麼可以稱做乙個極大團。3 如果乙個極大團的大小是最大的,那麼可以被稱為乙個最大團。最大團有以下常見性質,這裡不加證明的直接給出結論。最大團點的數...

最大團問題

題目 給定乙個圖的鄰接矩陣,求出該圖的所有最大團。最大完全子圖 1.自己思考的樸素演算法 1 根據題意畫出解空間樹 只以以1結點開始為例,其餘以其他結點開始的同下述方法 下圖中綠色結點為進入遞迴,紅色結點為不進入遞迴 從圖中發現,一種想法是按深度遍歷解集。關鍵問題就是如何設定遞迴的出口和去重。2 演...