poj-1129-Channel Allocation-四色定理
题意:
给你一个n,代表电台的数量。电台的编号是从A到Z。
然后给你他们之间的邻接关系,让你求出最小需要的频率数。
要求任意两个相邻的电台之间不允许用同一频率。
做法:
由于范围比较小,所有爆搜都没关系。但是如果电台的数量比较大的话,就需要运用四色定理了。
四色定理:
对于任意一张地图,最多只使用四种颜色就可以把地图任意两个相邻的国家染成不同的颜色。
对于这道题目可以看成给电台染色,任意两个电台用线连起来,任意两条线都是不相交的,这就符合四色定理。
注意:
注意在需要的频率为1的时候,channel无s,其他的时候channels有s。
#include<iostream>#include<stdio.h>#include<string.h>using namespace std;int main(){ int i,n,j; int map[101][101]; char str[1000]; while(scanf("%d%*c",&n)&&n) { memset(map,0,sizeof(map)); for(i=1;i<=n;i++) { gets(str); for(j=2;j<strlen(str);j++) { map[i][str[j]-'A'+1]=1; } } int visit[27]; int color[27]; memset(visit,0,sizeof(visit)); memset(color,0,sizeof(color)); int maxlen; maxlen=0; for(i=1;i<=n;i++) { memset(visit,0,sizeof(visit)); for(j=1;j<=n;j++) { if(map[i][j]!=0) { if(color[j]) { visit[color[j]]=1; } } } for(j=1;j<=26;j++) { if(visit[j]==0) { color[i]=j; if(j>maxlen)maxlen=j; break; } } if(j==4)break; } if(maxlen==1) { printf("1 channel needed.\n"); } else printf("%d channels needed.\n",maxlen); } return 0;}