UVA 193 - Graph Coloring

本文介绍了一种解决图染色问题的方法,通过回溯法确保相邻节点颜色不同,并记录每种染色方案中黑色节点的最大数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题也是一道染色的题,只有黑、白两种颜色,要求有边的两个点不能染成相同的颜色,我用回溯

法做的,判断与cur有边的点是否被染色,如果这些点中有一个点已经被染色,那么cur这点只能染与

被染色的点不同的颜色,我们就可以向下一个点搜索。如果cur周围的点没有被染色的话,那么cur这

点可以自由地染色,我们可以染成黑色或者白色,分两种情况向下一层搜索,直到将所有的点都染上

色。然后计数,看哪种情况染的黑色最多,将其复制到color数组中。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAXN 110
int n, k, m, ans;
bool g[MAXN][MAXN], vis[MAXN];
int rec[MAXN], color[MAXN];

void init()
{
memset( vis, false, sizeof vis);
memset( g, false, sizeof g);
memset( rec, 0, sizeof rec);
memset( color, 0, sizeof color);
ans = 0;
}

void input()
{
int a, b;
for( int i = 0; i < k; i ++)
{
scanf( "%d%d",&a, &b);
g[a][b] = g[b][a] = true;
}
}

void dfs( int cur)
{
if( cur > n) //因为是从1开始搜,所以cur等于n+1时就认为得到了一次结果
{
int t = 0;
for( int i = 1; i <= n; i ++)
if( rec[i] == 1) t ++;
if( t > ans) //判断是否比当前的结果多
{
ans = t;
memcpy( color, rec, sizeof rec); //将最新的染色情况复制到color数组中
}
}
else{
bool flag = false;
for( int i = 1; i <= n; i ++)
if( g[cur][i] && vis[i])
{
flag = true;
break;
}
if( flag) dfs( cur + 1);
else {
vis[cur] = true; // 设置使用标志
rec[cur] = 1;
dfs( cur + 1);
vis[cur] = false; //清除标志
rec[cur] = 0;
dfs( cur + 1);
}
}
}


int main()
{
scanf( "%d", &m);
while( m --)
{
scanf( "%d%d", &n, &k);
init();
input();
dfs( 1);
printf( "%d\n", ans);
int tt = 0;
for( int i = 1; i <= n; i ++)
{
if( color[i] == 1) {
if( ++ tt < ans)
printf( "%d ", i);
else
printf( "%d\n", i);
}
}
}
return 0;
}

 

转载于:https://www.cnblogs.com/Yu2012/archive/2012/01/15/2323021.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值