Uva--10004 (DFS,染色问题)
2014-07-08 02:48:40
题意:给出图(节点和连通关系),问用两种颜色染点能否使相邻点异色。
思路: 把图存在邻接链表(数组实现中),然后DFS。这里采用一种通用的模板,即给出N种颜色,能否染色。
1 #include <cstdio> 2 #include <iostream> 3 #include <cmath> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 const int N = 2; 8 int flag,n,m,g[205][205],cnt[205],col[205]; 9 10 void Dfs(int index){ 11 int i,used[N + 1] = {0}; 12 for(i = 0; i < cnt[index]; ++i) 13 used[col[g[index][i]]] = 1; 14 for(i = 1; i <= N; ++i) 15 if(!used[i]){ 16 col[index] = i; 17 break; 18 } 19 if(i > N){ 20 flag = 0; 21 return; 22 } 23 for(i = 0; i < cnt[index]; ++i) 24 if(!col[g[index][i]]) 25 Dfs(g[index][i]); 26 } 27 28 int main(){ 29 int a,b; 30 while(scanf("%d",&n) == 1 && n){ 31 scanf("%d",&m); 32 memset(g,0,sizeof(g)); 33 memset(cnt,0,sizeof(cnt)); 34 memset(col,0,sizeof(col)); 35 while(m--){ 36 scanf("%d %d",&a,&b); 37 g[a][cnt[a]++] = b; 38 g[b][cnt[b]++] = a; 39 } 40 flag = 1; 41 Dfs(0); 42 if(flag) printf("BICOLORABLE.\n"); 43 else printf("NOT BICOLORABLE.\n"); 44 } 45 return 0; 46 }