| ||||||||||
Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
暴力搜索时要注意即使新的点可以用之前用过的颜色涂,也要用新的颜色试一下#include <iostream> #include <cstring> #include <string> using namespace std; const int MAXN = 26 + 2; int map[MAXN][MAXN]; int Color[MAXN]; int N;//number of repeaters int MinColor; string Str;//information about every repeater void DFS(int Step, int CurColor)//Curlor record how many color exist when coming into step Step { if(Step == N) { if(CurColor < MinColor) MinColor = CurColor; return; } if(CurColor >= MinColor) return; int flag = 0; for(Color[Step] = 1; Color[Step] <= CurColor; ++Color[Step]) { int flag1 = 0; for(int i = 0; i < Step; ++i) { if(map[Step][i] && Color[Step] == Color[i]) { flag1 = 1; break; } } if(!flag1) DFS(Step + 1, CurColor); } DFS(Step + 1, CurColor + 1);//无论是否可以用之前已经用过的颜色涂,都要用新的颜色涂一下,否则会出错 } int main() { while(cin >> N) { if(N == 0) break; cin.ignore(); memset(map, 0, sizeof(map)); memset(Color, -1, sizeof(Color)); MinColor = 1000; for(int j = 1; j <= N; ++j) { getline(cin, Str); int row; int col; if(Str.length() > 2) { row = Str[0] - 'A'; for(int i = 2; i < Str.length(); ++i) { col = Str[i] - 'A'; map[row][col] = map[col][row] = 1; } } } Color[0] = 1; DFS(1, 1); if(MinColor == 1) cout << "1 channel needed." << endl; else cout << MinColor << " channels needed." << endl; } return 0; } /* 10 A:BCDEFG B:ACGH C:ABDH D:ACEHJ E:ADFIJ F:AEGI G:ABFHI H:BCDGIJ I:EFGHJ J:DEHI */ Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator