Graph Coloring |
找到理想的最多的黑点排布的情况,其中黑点不能相邻,而白点可以相邻,想清楚了就知道直接放黑点就行了,遇到不能放的地方不要放,可以放的地方选择放与不放,随时更新并保存理想的情况
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=129
1 #include2 #include 3 #include 4 #include 5 #define MAXN 110 6 using namespace std; 7 int graph[MAXN][MAXN]; 8 int note[MAXN], visit[MAXN], flag[MAXN], store[MAXN]; 9 int n, _max;10 11 12 int Traverse(int cur, int sum)13 {14 int choice = 1;15 if(_max < sum)16 {17 _max = sum;18 memcpy(store, flag, sizeof(int)*(n+1));19 }20 if(sum+n-cur+1 <= _max) return 0;21 for(int i=1; i<=n; ++i)22 if(graph[cur][i] && flag[i] != 0)23 {24 choice = 0;25 break;26 }27 if(choice == 1)28 {29 flag[cur] = 1;30 Traverse(cur+1, sum+1);31 flag[cur] = 0;32 }33 Traverse(cur+1, sum);34 return 0;35 }36 37 int main()38 {39 #ifndef ONLINE_JUDGE40 freopen("input.txt", "r", stdin);41 #endif42 int T;43 cin>>T;44 while(T--)45 {46 int k;47 cin>>n>>k;48 memset(graph, 0, sizeof(graph));49 memset(flag, 0, sizeof(flag));50 memset(store, 0, sizeof(store));51 for(int i=0; i >from>>to;55 graph[from][to] = graph[to][from] = 1;56 }57 _max = 0;58 Traverse(1, 0);59 printf("%d\n", _max);60 for(int i=1,j=0; i<=n; ++i)61 {62 if(store[i] != 0)63 {64 if(j++ == 0) printf("%d", i);65 else printf(" %d", i);66 }67 }68 printf("\n");69 }70 return 0;71 }
我能告诉你我错了无数遍吗?算了吧,菜鸟一个就是蛋疼!!!这次是想着减少不必要的遍历,却发现改来改去都是WA,肯定不知道哪里错了,花了一个早上的时间也算对得住它,起码自己的抗压能力又提高到了一个层次