您的位置:首页 > 其它

Uva 193 - Graph Coloring

2013-04-29 13:00 417 查看
Graph Coloring
找到理想的最多的黑点排布的情况,其中黑点不能相邻,而白点可以相邻,想清楚了就知道直接放黑点就行了,遇到不能放的地方不要放,可以放的地方选择放与不放,随时更新并保存理想的情况

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=129

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#define MAXN 110
using namespace std;
int graph[MAXN][MAXN];
int note[MAXN], visit[MAXN], flag[MAXN], store[MAXN];
int n, _max;

int Traverse(int cur, int sum)
{
int choice = 1;
if(_max < sum)
{
_max = sum;
memcpy(store, flag, sizeof(int)*(n+1));
}
if(sum+n-cur+1 <= _max) return 0;
for(int i=1; i<=n; ++i)
if(graph[cur][i] && flag[i] != 0)
{
choice = 0;
break;
}
if(choice == 1)
{
flag[cur] = 1;
Traverse(cur+1, sum+1);
flag[cur] = 0;
}
Traverse(cur+1, sum);
return 0;
}

int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
int T;
cin>>T;
while(T--)
{
int k;
cin>>n>>k;
memset(graph, 0, sizeof(graph));
memset(flag, 0, sizeof(flag));
memset(store, 0, sizeof(store));
for(int i=0; i<k; ++i)
{
int from, to;
cin>>from>>to;
graph[from][to] = graph[to][from] = 1;
}
_max = 0;
Traverse(1, 0);
printf("%d\n", _max);
for(int i=1,j=0; i<=n; ++i)
{
if(store[i] != 0)
{
if(j++ == 0) printf("%d", i);
else printf(" %d", i);
}
}
printf("\n");
}
return 0;
}


我能告诉你我错了无数遍吗?算了吧,菜鸟一个就是蛋疼!!!这次是想着减少不必要的遍历,却发现改来改去都是WA,肯定不知道哪里错了,花了一个早上的时间也算对得住它,起码自己的抗压能力又提高到了一个层次





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: