这题因为数据比较弱,直接用贪心过的。
题意:平面内最多26个点,给出一些点与点之间的矛盾关系,问最少使用多少颜色才能给这些点染色,并保证矛盾点之间不同色。
贪心思路:先进行建图,把各点与颜色都用序号标记,从小到大逐一寻找,每个点找的都是与该点的相邻边中未使用的颜色序号中最小的那个,如果当前的颜色在相邻边中都被使用了,则增加颜色数量,即颜色序号加一。
原题链接:点击打开链接
下面贴AC代码:
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
char str[27];
int map[30][30],flag[30],color[30];
int main()
{
int n,i,j;
while(cin>>n,n)
{
memset(color,0,sizeof(color));
memset(map,0,sizeof(map));
for(i=1;i<=n;i++)
{
cin>>str;
int len=strlen(str);
for(j=2;j<len;j++)
{
map[str[0]-'A'+1][str[j]-'A'+1]=1; //进行建图,相连的边标记为1
map[str[j]-'A'+1][str[0]-'A'+1]=1;
}
}
int k=0,nmaxcolor=1;
for(i=1;i<=n;i++)
{
memset(flag,0,sizeof(flag)); //数组flag代表颜色是否被相邻边使用过,1为使用过
for(j=1;j<i;j++)
{
if(map[i][j]==1)
flag[color[j]]=1;
}
for(k=0;k<nmaxcolor;k++) //找最小的未被相邻边使用过的颜色的序号
if(!flag[k])
break;
if(k<nmaxcolor)
color[i]=k;
else
{
color[i]=nmaxcolor;
nmaxcolor++;
}
}
if(nmaxcolor>1)
cout<<nmaxcolor<<" channels needed."<<endl;
else
cout<<"1 channel needed."<<endl;
}
return 0;
}