1. n個學生對m個宣講會中的若干個感興趣,如何安排宣講會的時間(每個宣講會持續的時間相同),使得每個學生對自己感興趣的宣講會時間不衝突,且宣講會的總時間最短?
此問題可以轉化成頂點著色問題。
把每個宣講會看作是一些散布的點,對於每個學生,把他感興趣的宣講會之間兩兩相連,如:
學生a希望參加宣講會1、2、3
學生b希望參加宣講會1、3、4 則:
設宣講會1、2、3、4的著色分別為c1、c2、c3、c2,4與2著同樣的顏色,則可以這樣安排宣講會的時間,假設持續時間為一小時,宣講會1在1點開,2在2點開,3在3點開,4與2時間一樣在2點開。
2. 對n個區間進行著色,有重疊的區間不能著同樣的顏色。
可轉化為頂點著色問題,但頂點著色問題是np的,至今沒有乙個已知的好演算法,所以對圖的色數進行估計以及在尋找使用的顏色數「不太大」的情形下頂點著色的某些方法又有非常重要的意義。於是頂點著色的貪婪演算法應運而生。
頂點著色的貪婪演算法是按順序取第乙個可用的顏色而忽略對以後的頂點可能會產生的後果。使用正整數對頂點著色,因此可以談論一種顏色小於另一種顏色了。
(1) 色數
設g =(v,e)是乙個圖,g的頂點著色就是g的每個頂點指定一種顏色,且使得相鄰頂點有不同的顏色。如果這些顏色選自於乙個 k 種顏色的集合而不管 k 種顏色是否都用到,那麼頂點著色稱為k-頂點著色,簡稱為k-著色。g有乙個 k 著色,那麼g是 k-可著色的。使得g是 k-可著色的最小的 k 稱為g的色數,
用χ(g)表示。
(2) 頂點著色的貪婪演算法
設g是乙個圖,它的頂點按某一順序記為x1,x2,...,xn。
i ) 對頂點x1指定顏色1.
ii) 對每個 i = 2,3,...,n,另 p 是與 xi 鄰接的頂點 x1,x2,...,xi-1 中沒有任何乙個頂點著色 p 的最小的顏色,並且對 xi 指定顏色 p。
下面是乙個定理:
設g是乙個圖,對於該圖頂點的最大度
為δ,那麼貪婪演算法產生g的頂點
的乙個-著色(但並不意味著δ + 1種顏色都用到),因此
(3) 演算法設計
回到原始問題:對n個區間進行著色,有重疊的區間不能著同樣的顏色。下面是解決這個問題的演算法,摘自《程式設計之美》。
共n個區間,對這n個區間按照區間開始從小到大排序,設為:
[b[i], e[i]] 0 <= i < n
color[i]為顏色號 0 <= i < n
color[i] = 0 i = 0時,
color[i+1] = color[i] 第 i 區間與第 i + 1 區間無重疊時,
color[i + 1] = color[i] + 1 第 i 區間與第 i + 1 區間有重疊時。
演算法如下:
int overlap(int b1, int e1, int b2, int e2)
int intervalcoloring(int b, int e, int color, int n)
}// for
return nmaxcolors;
}
分析:(a) 把這當前已著色的nmaxcolors種顏色設為可用。
(b) j從區間0開始到區間 i-1與當前待著色區間 i 判斷兩區間是否有重疊,若有則著區間 j 的顏色不能用來著區間 i 。
(c) k從0到nmaxcolors - 1,判斷這nmaxcolors種顏色有能著區間 i 的。
測試**如下:
#include #include int overlap(int b1, int e1, int b2, int e2);
int intervalcoloring(int b, int e, int color, int n);
int main(void)
, e = ;
int color[n], nmaxcolors = 0;
nmaxcolors = intervalcoloring(b, e, color, n);
printf("nmaxcolors = %d\n", nmaxcolors);
printf("\ncolor of the intervals:\n");
for (i = 0;i < n;i++)
printf("interval %d: color %d\n",i, color[i]);
return 0;
}
輸出: 頂點著色程式
頂點著色程式從gpu前端模組 暫存器 中提取圖元資訊 頂點位置.法向量 紋理座標等 並完成頂點座標空間轉換,法向量空間轉換,光照計算等操作。最後將計算好的資料傳送到指定暫存器中。然後片段著色器從種獲取需要的資料,通常為 紋理座標,光照資訊等 並根據這些資訊以及從應用程式傳遞的紋理資訊進行每個片段的顏...
Vertex Shader 頂點著色入門
vertex shader是什麼?頂點著色是一段執行在gpu上的程式 一般用hlsl來編寫 用來取代fixed pipeline中的transformation和lighting,vertex shader主要操作頂點。當然前提是硬體要支援,軟體模擬的不算 有圖則一目了然 vertex shader...
HLSL頂點著色器
1.在文字檔案裡編寫頂點著色器 hlsl語言 2.編譯著色器 d3dxcompileshaderfromfile 3.建立頂點著色器 createvertexshader 4.獲取hlsl語言中變數控制代碼 getconstantbyname 5.根據控制代碼給hlsl語言中的變數傳值 id3dxc...