題意:如果相鄰的中繼器使用不同的頻道,就不會相互干擾。
給定一些中繼器的相鄰關係,問至少要選幾個不同的頻道,使得中繼器都不互相干擾。
分析:這題可以轉化爲無向圖的染色問題,
即相鄰的點不能染同一種顏色,求至少需要的幾種顏色?
本題頂點數最多爲26,可以直接用暴力搜索即可
思路:若頂點總數爲n,則最多需要n種顏色(編號爲1,2...n),
從最小的頂點開始染色,每次將與該頂點相鄰的已染色的顏色標記,
再從未標記(未用)的顏色中,選出一個最小的顏色,給該點染色,
所有點染色完後,再統計用了幾種顏色就是所求答案.
注:如果答案爲1時,輸出的channel爲單數,否則爲複數channels
#include<stdio.h>
#include<string.h>
int main()
{
int n,i,j,vis[30],color[30],sum;
char s[30];
while(scanf("%d",&n)!=EOF){
if(n==0)
break;
memset(color,0,sizeof(color));
for(i=0;i<n;i++){
scanf("%s",s);
memset(vis,0,sizeof(vis));
for(j=2;s[j]!='\0';j++) //標記相鄰頂點所染的顏色
if(color[s[j]-'A'])
vis[color[s[j]-'A']]=1;
for(j=1;j<=n;j++) //找到最小的未被用的顏色,給頂點i染色
if(!vis[j]){
color[i]=j; //給頂點i染j顏色
break;
}
}
memset(vis,0,sizeof(vis));
sum=0;
for(i=0;i<n;i++){ //統計所用不同顏色的種數
if(!vis[color[i]]){
sum++;
vis[color[i]]=1;
}
}
if(sum==1)
printf("%d channel needed.\n",sum);
else
printf("%d channels needed.\n",sum);
}
return 0;
}