Description
You are to write a program that tries to find an optimal coloring for a given graph. Colors are applied to the nodes of the graph and the only available colors are black and white. The coloring of the graph is called optimal if a maximum of nodes is black. The coloring is restricted by the rule that no two connected nodes may be black.
Figure 1: An optimal graph with three black nodes
Input
The graph is given as a set of nodes denoted by numbers 1…n, n <= 100, and a set of undirected edges denoted by pairs of node numbers (n1, n2), n1 != n2. The input file contains m graphs. The number m is given on the first line. The first line of each graph contains n and k, the number of nodes and the number of edges, respectively. The following k lines contain the edges given by a pair of node numbers, which are separated by a space.
Output
The output should consists of 2m lines, two lines for each graph found in the input file. The first line of should contain the maximum number of nodes that can be colored black in the graph. The second line should contain one possible optimal coloring. It is given by the list of black nodes, separated by a blank.
Sample Input
1
6 8
1 2
1 3
2 4
2 5
3 4
3 6
4 6
5 6
Sample Output
3
1 4 5
因为数据都不是很大,所以可以暴力直接搜索过
#include<iostream>
#include<vector>
#include<cstring>
#include<cstdio>
using namespace std;
int map[110][110];
int color[110];
int tmp[110];
int len;
int maxlen;
int ind;
int n,k;
void DFS(int num)
{
int i;
if(num==n) //当num==n,表示已经搜寻完毕
{
if(len>maxlen)
{
maxlen=len;
for(i=1,ind=0; i<=n; i++)
if(color[i])
tmp[ind++]=i;
}
return ;
}
for(i=1; i<=n; i++)
if(i!=num && map[i][num] && color[i]) //搜寻周围的点是否有被着色
break;
if(i>n) //如果没有,则,i>n
{
color[num]=1; //进行着色
len++;
DFS(num+1); //搜寻下一个点
color[num]=0; //不管是否能找到点,这个点都要变白,以便下一次搜寻
len--;
}
DFS(num+1); //另一次搜寻
}
int main()
{
int t;
int i;
int x,y;
scanf("%d",&t);
while(t--)
{
memset(map,0,sizeof(map));
memset(color,0,sizeof(color));
len=maxlen=0;
scanf("%d%d",&n,&k);
while(k--)
{
scanf("%d%d",&x,&y);
map[x][y]=map[y][x]=1;
}
DFS(1);
printf("%d\n%d",maxlen,tmp[0]);
for(i=1; i<maxlen; i++)
printf(" %d",tmp[i]);
printf("\n");
}
return 0;
}
本文介绍了一个图论中的经典问题——图染色问题,并提供了一种通过深度优先搜索(DFS)来寻找最优解的方法。具体地,对于给定的无向图,目标是找到一种染色方案使得最多数量的节点被染成黑色,同时确保没有相邻节点颜色相同。

757

被折叠的 条评论
为什么被折叠?



