1. 程式人生 > >UVa 1613 K-Graph Oddity 題解

UVa 1613 K-Graph Oddity 題解

容易 實現 一個 可用 求一個 貪心 不知道 pos for

難度:α+

題目:??

這題要求我們用最少的顏色給一個圖裏的每個點染色,使相鄰點顏色不同。

雖然我不知道正確的證明,但是很容易想到用貪心的方法做。

就是從一個點開始,染色,接著到一個相鄰點,染色,接著繼續下去。

這個做法可以 AC。

實現上面,用隊列進行點的遍歷。用數組記錄該點可用的顏色。那麽更新完一個點後需要把它相鄰點的可取顏色集合去掉自己選過的。

 1 while (!q.empty()) { 
 2     int v = q.front(); q.pop();
 3     k = max(k, (int)G[v].size()); // 題目要求一個點的最大度數 K
 4
for (int c = 1; c <= n; c++) { // 枚舉選擇顏色 5 if (!valid[v][c]) continue; // 如果不能選這個顏色,繼續枚舉 6 color[v] = c; // 記錄該點的顏色 7 col = max(col, c); // 顏色也要求一個最大值,之後要更新 K。因為 K >= Col 8 for (int i = 0; i < G[v].size(); i++) { // 更改相鄰點的可取顏色 9 int u = G[v][i]; 10
valid[u][c] = 0; // 相鄰點不可取 11 if (vis[u]) continue; // 如果在隊裏就不加入 12 q.push(u); vis[u] = 1; 13 } 14 break; // 選完顏色就可以進行到下一個點了 15 } 16 }

2018-02-07

UVa 1613 K-Graph Oddity 題解