佇列應用 劃分子集問題

2021-10-24 23:01:17 字數 1943 閱讀 1908

集合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時,共有四種方式可以將集合 分為兩個部分和相同的子集合 和 和 和 和 輸入 程式從標準輸入讀入資料,只有一組測試用例...