poj1129

11 篇文章 0 订阅

典型的图着色问题,相邻的顶点不能着相同的颜色。求最少的着色数。贪心法求解。每次都从颜色编号1开始着色,若相邻的顶点中存在该颜色,则增加颜色为编号2,若相邻的顶点中仍存在该颜色,则增加颜色为3,一直循环。下面给出代码(代码中注释部分要注意):

#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#define Max 30
using namespace std;
bool trim[Max][Max];
int record[Max];
int help[Max];
int n;
void Set_record(int number){
	int pivot=0;
	for(int i=1;i<=n;i++) // 将所有相邻的结点的颜色编号记录在help数组中
		if(trim[i][number])
			help[pivot++]=record[i];
    sort(help,help+pivot); // 排序,便于比较
	record[number]=1; // 初始为颜色 1
	for(int i=0;i<pivot;i++) // 贪心算法
		if(help[i]==record[number])
			record[number]++;
}
int main(){
	char temp;
	while(scanf("%d",&n),n){
		memset(trim,0,sizeof(trim)); 
		memset(record,0,sizeof(record)); // 初始为颜色编号0(无效编号)
    for(int i=1;i<=n;i++){
		getchar();
		getchar();
		while(true){
		temp=getchar();
	    if(temp=='\n')
			break;
		trim[i][temp-'A'+1]=true;
		}
	}
	for(int i=1;i<=n;i++)
		Set_record(i);
	sort(record+1,record+1+n);
	int Count=1;
	for(int i=1;i<n;i++) // 求出不同颜色个数
		if(record[i+1]>record[i])
			Count++;
	if(Count==1) // 注意单复数channel
	    printf("1 channel needed.\n");
	else
		printf("%d channels needed.\n",Count);
	}
	return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值