POJ 1129 Channel Allocation(四色定理)

Channel Allocation

题意:
题目大概是说无线电可以覆盖的范围很大,我们可以通过中继器继续扩大范围,但是中继器的信号干扰也很强,同一频道用相邻的中继器会使信号相互干扰,大大降低他们的收听质量,所以同一频道的电台尽量使用不相邻的中继器
给出了每个中继器的相邻情况,问最少有几个频道用中继器不会产生干扰

把题意抽象出来,将中继器看作结点,相邻的两个中继器之间连一条边,用最少的颜色给相邻的结点涂上不一样的颜色

这就牵扯四色定理了,四色定理是这样说的:
任何一张地图只用四种颜色就能使具有共同边界的国家着上不同的颜色。所以我们可以确定答案一定不超过4,这样就可以直接定义四种颜色为1 、2、3、 4去染色,一旦两个结点之前存在边并且和上一个结点颜色不一样就标记一下,如果颜色相同就给当前结点染上不一样的颜色,去递归下一个结点

int mapp[26][26],ans[26];
char s[28];
int n;

void dfs(int k){
	int flag;
	if(k == n) return ; // 所有点都已经跑完 退出循环 
	for(int i=1;i<=4;i++){ // 基于四色定理 
		flag = 0;
		for(int j=0;j<n;j++){ 
		// 两点之间存在边并且这个结点与上一个结点颜色不同 
			if(mapp[k][j] && ans[j] == i){
				flag = 1;
				break;
			}
		}
		if(flag == 0){ 
		// 说明新的结点与上一个结点颜色相同 
			ans[k] = i;
			dfs(k+1);
			break;
		}
	}
}

int main(){
	
	while(~scanf("%d",&n) && n != 0){
		memset(mapp,0,sizeof mapp);
		memset(ans,0,sizeof ans);
		for(int i=0;i<n;i++){
			scanf("%s",s);
			for(int j=2;s[j];j++){ // 将相邻的点存为1 
				mapp[i][s[j]-'A'] = 1; 
				mapp[s[j]-'A'][i] = 1;
			}
		}
		dfs(0); // 从第一个点开始 
		sort(ans,ans+26);
		if(ans[25] == 1){
			printf("%d channel needed.\n",ans[25]);
		}else{
			printf("%d channels needed.\n",ans[25]);
		}
	}
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你数过天上的星星吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值