您的位置:首页 > 其它

uva 193 Graph Coloring

2013-10-25 16:48 302 查看
用回溯法枚举n个节点可能的黑白组合,图的遍历不一定非要按照邻接的节点进行dfs,回溯的条件是,即使接下来所有没有访问的节点都涂黑色,也不可能比当前全局的最多黑色节点数目多,就进行回溯。

#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;

#define		BLACK		0
#define		WHITE		1

bool link_table[200][200];
int color[200];
vector<int> black_nodes;

int max_black_node_num;

void dfs(int cur, int max_pos, int last_black_num)
{
if(last_black_num + (max_pos-cur+1) <= max_black_node_num)
return;

if(cur == max_pos+1)
{
max_black_node_num = last_black_num;
black_nodes.clear();
for(int i=1; i<=max_pos; i++)
if(color[i] == BLACK)
black_nodes.push_back(i);

return;
}

if(cur == 1)
{
color[cur] = BLACK;
dfs(cur+1, max_pos, last_black_num+1);
color[cur] = WHITE;
dfs(cur+1, max_pos, last_black_num);
}
else
{
bool f;
int i;

f = true;
for(i=1; i<=cur-1; i++)
if(link_table[cur][i] && color[i]==BLACK)
{
f = false;
break;
}

if(f)
{
color[cur] = BLACK;
dfs(cur+1, max_pos, last_black_num+1);
}

color[cur] = WHITE;
dfs(cur+1, max_pos, last_black_num);
}
}

void func(int n)
{
int i;

max_black_node_num = 0;
dfs(1, n, 0);
printf("%d\n", max_black_node_num);
for(i=0; i<black_nodes.size()-1; i++)
printf("%d ", black_nodes[i]);
printf("%d\n", black_nodes[i]);
}

int main(void)
{
int N, n, k, i, j;
int a, b;

//freopen("input.dat", "r", stdin);
//freopen("output.dat", "w", stdout);

scanf("%d", &N);
while(N--)
{
scanf("%d %d", &n, &k);
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
link_table[i][j] = false;
}

for(i=1; i<=k; i++)
{
scanf("%d %d", &a, &b);
link_table[a][b] = link_table[b][a] = true;
}

func(n);
}

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