集合a如下:
a=,集合r中(a,b)表示a與b是衝突關係,不能放在同一子集中:
r=,求一可行的子集劃分,使a劃分為互不相交的子集,並使子集個數盡量少。
#include
using
namespace std;
#define maxsize 10
// 迴圈佇列元素個數應加一
#define error 0
#define ok 1
#define n 9
// 佇列的結構體
typedef
struct
sqqueue;
// 初始化
intinitqueue
(sqqueue& q)
q.front = q.rear =0;
return ok;
}// 入隊
intenqueue
(sqqueue& q,
int e)
q.base[q.rear]
= e;
q.rear =
(q.rear +1)
% maxsize;
return ok;
}// 出隊
intdelqueue
(sqqueue& q,
int& e)
e = q.base[q.front]
; q.front =
(q.front +1)
% maxsize;
return ok;
}// 求長
intqueuelength
(sqqueue& q)
// 判空
intemptyqueue
(sqqueue& q)
else
}// 列印
void
printqueue
(sqqueue& q)
cout << endl;
}// 分類
void
dividequeue
(int r[
][n]);
// 結果矩陣,用於存放劃分結果
int group =0;
// 組號
sqqueue cq;
initqueue
(cq)
;// 新增佇列元素
for(
int i =
0; i < n; i++
)// printqueue(cq);
int preitem = cq.rear;
// preitem為前一次出隊元素,初始值為隊尾元素
int curitem =
*cq.base;
// curitem為當前元素,初始值為隊首元素
// cout << curitem << endl;
int newr[n]=;
// 工作陣列newr用於存放衝突資訊
// 在佇列不為空時進行
while(!
emptyqueue
(cq)
)// 在隊首元素不為前一次元素時
while
(cq.front != preitem)
}else
} preitem = cq.rear;
// 每次遍歷完之後將新佇列隊尾元素作為本次標誌元素
}// 顯示結果
for(
int p =
1; p <= group; p++)}
cout << endl;}}
intmain()
;// 衝突關係矩陣
劃分子集問題
問題描述 已知集合a 及集合上的關係r 其中 ai,aj 表示ai與aj間存在衝突關係。要求將a劃分成互不相交的子集a1,a2,ak,k n 使任何子集中的元素均無衝突關係,同時要求分子集個數盡可能少。思路 先構造乙個佇列,將a中元素進隊,然後依次取出元素放入乙個待分配的組中,若當前元素與改組中已經...
資料結構 佇列應用舉例 劃分子集問題
經過一天的奮鬥,解決 description 已知集合a 及集合上的關係r 其中 ai,aj 表示ai與aj間存在衝突關係。要求將a劃分成互不相交的子集a1,a2,ak,k?n 使任何子集中的元素均無衝突關係,同時要求分子集個數盡可能少 sample input a r sample output ...
DP 劃分子集和問題
對於由從1到n 1 n 39 這n個連續的整數組成的集合來說,我們有時可以將集合分成兩個部分和相同的子集合。例如,n 3時,可以將集合 分為和。此時稱有一種方式 即與順序無關 n 7時,共有四種方式可以將集合 分為兩個部分和相同的子集合 和 和 和 和 輸入 程式從標準輸入讀入資料,只有一組測試用例...