劃分子集問題

2021-08-29 21:01:58 字數 1286 閱讀 3864

問題描述:已知集合a=,及集合上的關係r=,其中(ai,aj)表示ai與aj間存在衝突關係。要求將a劃分成互不相交的子集a1,a2,……ak,(kn),使任何子集中的元素均無衝突關係,同時要求分子集個數盡可能少。

思路:先構造乙個佇列,將a中元素進隊,然後依次取出元素放入乙個待分配的組中,若當前元素與改組中已經入選的元素無衝突,將其放入陣列中,如果產生衝突則繼續放在佇列的尾部;當遍歷一輪佇列中的所有元素後,產生乙個無衝突的子集,如此迴圈直到所有元素都被分配完成時結束。(**中隊列為q,陣列為a)

去年遇到的乙個題,當初想的是建圖來做,不過最後發現有問題就不了了之了,最近有人問,就看了下題解,原來就是暴力莽。。。

#include #include #include #define max 1005

bool r[max][max];//關係陣列,r[i][j]==1,表示i,j衝突

int a[max];

int result[max];//記錄結果,result[i]=j表示i在第j組

int n;//元素個數

using namespace std;

struct que

sz++;//佇列內元素個數加一

q[rr] = x;

rr = (rr + 1) % max;// 隊尾後移一位

}int pop()

sz--;//元素個數減一

ft = (ft+1) % max;//隊首後移一位

return q[ft-1];

}bool emp()

};que q;

void print(que que)

}void solve()

int j = 0;

for(j = 0; j < acnt; j++)

}//當x跟a中元素都無衝突時

if(j == acnt)

}//此時a陣列可得到乙個不衝突的子集將其中的元素編號

for(int i = 0; i < acnt; i++)

ans++;//組號加一

}for(int i = 1; i < ans; i++)

printf("\n");

}return;

}int main()

solve();

return 0;}/*

測試樣例913

2 89 4

2 92 1

2 56 2

5 95 6

5 47 5

7 63 7

6 3*/

DP 劃分子集和問題

對於由從1到n 1 n 39 這n個連續的整數組成的集合來說,我們有時可以將集合分成兩個部分和相同的子集合。例如,n 3時,可以將集合 分為和。此時稱有一種方式 即與順序無關 n 7時,共有四種方式可以將集合 分為兩個部分和相同的子集合 和 和 和 和 輸入 程式從標準輸入讀入資料,只有一組測試用例...

佇列應用 劃分子集問題

集合a如下 a 集合r中 a,b 表示a與b是衝突關係,不能放在同一子集中 r 求一可行的子集劃分,使a劃分為互不相交的子集,並使子集個數盡量少。include using namespace std define maxsize 10 迴圈佇列元素個數應加一 define error 0 defi...

資料結構 佇列應用舉例 劃分子集問題

經過一天的奮鬥,解決 description 已知集合a 及集合上的關係r 其中 ai,aj 表示ai與aj間存在衝突關係。要求將a劃分成互不相交的子集a1,a2,ak,k?n 使任何子集中的元素均無衝突關係,同時要求分子集個數盡可能少 sample input a r sample output ...