首先介紹下最大團問題:
問題描述:給乙個無向圖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 演...