問題描述:已知集合a=,及集合上的關係r=,其中(ai,aj)表示ai與aj間存在衝突關係。要求將a劃分成互不相交的子集a1,a2,……ak,(kn),使任何子集中的元素均無衝突關係,同時要求分子集個數盡可能少。
思路:先構造乙個佇列,將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 ...