小z的地图 | ||||||
| ||||||
Description | ||||||
小z有一张被分割成了N块不规则的多边形区域的地图,他将每块多边形区域从1到N依次标号。 他现在想将所有多边形区域涂上颜色,并且让所有相邻的多边形区域颜色不同。小z想知道 最少需要多少种颜色可以将地图涂满。
| ||||||
Input | ||||||
输入第一行为组数T(T<=15)。 对于每组数据第一行为两个整数N和M(1 <= N <= 30)。 分别代表有多边形的数量,以及多边形之间的相邻的数量。 接下来有M个整数对a b。代表多边形a和多边形b相连。 | ||||||
Output | ||||||
对于每组数据输出最少需要的颜色数量。 | ||||||
Sample Input | ||||||
2 7 9 1 2 1 3 2 3 2 5 3 5 3 4 3 6 4 6 4 7 5 4 1 2 2 3 3 4 4 5 | ||||||
Sample Output | ||||||
3 2 | ||||||
Hint | ||||||
已知对于地图着色,最多只需四种颜色即可保证相邻多边形区域颜色不同,并且将地图涂满。 | ||||||
Author | ||||||
陈禹@HRBUST |
思路:
1、根据离散数学的四色猜想.对于平面图着色,最多需要四种颜色就能保证相邻的多边形区域颜色不同,并且将地图涂满。虽然四色定理只是猜想,但是对于小规模数据是一定适用的。
2、那么考虑四次枚举,每次枚举一个上届(从小到大),进行Dfs,每Dfs到一个点,同时暴力判断并染色,对应第一个可行的解,输出即可。
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
int map[50][50];
int color[50];
int n,m,ok;
int judge(int u,int col)
{
for(int i=1;i<=n;i++)
{
if(map[u][i]==1&&color[i]==col)return 0;
}
return 1;
}
void Dfs(int u,int col)
{
if(u==n+1)
{
ok=1;return ;
}
for(int i=1;i<=col;i++)
{
if(judge(u,i)==1)
{
color[u]=i;
Dfs(u+1,col);
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(map,0,sizeof(map));
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
map[x][y]=map[y][x]=1;
}
ok=0;
for(int i=1;i<=4;i++)
{
memset(color,0,sizeof(color));
Dfs(1,i);
if(ok==1)
{
printf("%d\n",i);
break;
}
}
}
}