poj 1620 Phone Home

#include<iostream>        //求图的色数,即使各相邻顶点的颜色不相同所需的最小色数.数据量小,直接枚举+DFS
#include<stdio.h>
#include
<cmath>
#include
<cstring>
using namespace std;
struct node
{
double x,y;
}point[
20];
int n,cnt[20][20],color[20],num,suc;
void dfs(int i)
{
for(int c=1;c<=num;++c)
{
int flag=1;
for(int j=0;j<n;++j)
if(cnt[i][j]==1&&color[j]==c)
{
flag
=0;
break;
}
if(flag==1)
{
color[i]
=c;
if(i==n-1)
{
suc
=1;
break;
}
dfs(i
+1);
if(suc==1)
break;
color[i]
=0; //枚举色数num改变时要把所有顶点的颜色再次初始化
}
}
}
int main()
{
int cases=1;
while(cin>>n&&n)
{
for(int i=0;i<n;++i)
cin
>>point[i].x>>point[i].y;
memset(cnt,
0,sizeof(cnt));
for(int i=0;i<n;++i)
for(int j=i+1;j<n;++j)
if(pow(point[i].x-point[j].x,2.0)+pow(point[i].y-point[j].y,2.0)<=400)
cnt[i][j]
=cnt[j][i]=1;
memset(color,
0,sizeof(color));
suc
=0;
for(num=1;num<=4;++num) //枚举色数, 根据四色定理,色数最大为4
{
dfs(
0);
if(suc==1)
{
printf(
"The towers in case %d can be covered in %d frequencies.\n",cases++,num);
break;
}
}
}
return 0;
}

  

posted on 2011-07-22 22:41  sysu_mjc  阅读(195)  评论(0编辑  收藏  举报

导航