1. 程式人生 > >Uva 1613 - K-Graph Oddity

Uva 1613 - K-Graph Oddity

soft pri sof while print 輸入 顏色不同 == 結點

鏈接:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4488

題意:

輸入一個n(3≤n≤9999)個點m條邊(2≤m≤100000)的連通圖,n保證為奇數。
設k為最小的奇數,使得每個點的度數不超過k,你的任務是把圖中的結點塗上顏色1~k,使得相鄰結點的顏色不同。
多解時輸出任意解。輸入保證有解。

分析:

遞歸構造可以解決這道題。不過為什麽可以這樣我還沒想明白。

代碼:

 1 #include <cstdio>
 2
#include <cstring> 3 #include <vector> 4 using namespace std; 5 6 const int UP = 9999 + 5; 7 int k, vis[UP], color[UP]; 8 vector<int> edge[UP]; 9 10 void dfs(int node){ 11 if(color[node]) return; 12 for(int i = 0; i < edge[node].size(); i++){ 13 int b = edge[node][i];
14 vis[color[b]] = node; 15 } 16 for(int i = 1; i <= k; i++) if(vis[i] != node){ 17 color[node] = i; 18 break; 19 } 20 for(int i = 0; i < edge[node].size(); i++) dfs(edge[node][i]); 21 } 22 23 int main(){ 24 int n, m; 25 while(~scanf("%d%d", &n, &m)){
26 for(int i = 1; i <= n; i++) edge[i].clear(); 27 for(int f, b, i = 0; i < m; i++){ 28 scanf("%d%d", &f, &b); 29 edge[f].push_back(b); 30 edge[b].push_back(f); 31 } 32 33 k = 0; 34 for(int i = 1; i <= n; i++) k = max(k, (int)edge[i].size()); 35 if(k % 2 == 0) k++; 36 37 memset(vis, 0, sizeof(vis)); 38 memset(color, 0, sizeof(color)); 39 dfs(1); 40 41 printf("%d\n", k); 42 for(int i = 1; i <= n; i++) printf("%d\n", color[i]); 43 printf("\n"); 44 } 45 return 0; 46 }

Uva 1613 - K-Graph Oddity