UVA 193 Graph Coloring

本文针对UVA_193题目提出了一种高效解法,通过深度优先搜索(DFS)来求解图中能够涂为黑色的最大顶点数。该方法避免了直接枚举所有顶点带来的超时问题,利用已涂色顶点限制后续选择,有效减少了搜索空间。

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

UVA_193

这个题目的题意并不难理解,但由于这个题目节点数最多可到100个,如果是直接依次枚举每个点并判断这个点时候可以涂成黑色的话是会超时的。

仔细想了一下,实际上如果一个点涂成黑色的话,那么和它相邻的所有点都必须涂成白色,这样如果我们每涂一个黑色的点,实际上剩下的可以涂成黑色的点就很明显了,只要是没有涂过色的都可以。只要按这样的规则不停地枚举可以涂成黑色的点并将其涂成黑色就可以了,当被涂色的点的数量达到n时,就可以数涂成黑色的点的数量了,或者可以直接把黑色的点的数量当做深搜函数的一个参数,这样最后就不用再数一遍了。

想到上面的思路后,深搜的函数就比较好写了。

#include<stdio.h>
#include
<string.h>
int G[110][110];
int n,ans[110],res;
void dfs(int cur,int *A)
{
int i,j,num,color[110];
if(cur==n)
{
num
=0;
for(i=0;i<n;i++)
if(A[i])
num
++;
if(num>res)
{
memcpy(ans,A,
sizeof(ans));
res
=num;
}
return;
}
for(i=0;i<n;i++)
if(A[i]<0)
{
memcpy(color,A,
sizeof(color));
color[i]
=1;
num
=1;
for(j=0;j<n;j++)
if(G[i][j]&&color[j]<0)
{
color[j]
=0;
num
++;
}
dfs(cur
+num,color);
}
}
int main()
{
int i,j,k,t,m,a,b,A[110];
scanf(
"%d",&t);
while(t--)
{
scanf(
"%d%d",&n,&m);
memset(G,
0,sizeof(G));
for(i=0;i<m;i++)
{
scanf(
"%d%d",&a,&b);
a
--;
b
--;
G[a][b]
=G[b][a]=1;
}
res
=0;
memset(A,
-1,sizeof(A));
dfs(
0,A);
printf(
"%d\n",res);
k
=0;
for(i=0;i<n;i++)
if(ans[i])
{
if(k++)
printf(
" ");
printf(
"%d",i+1);
}
printf(
"\n");
}
return 0;
}

  

转载于:https://www.cnblogs.com/staginner/archive/2011/09/07/2169683.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值