现在的位置: 首页 > 综合 > 正文

POJ 1129 图的四色定理

2018年04月29日 ⁄ 综合 ⁄ 共 1151字 ⁄ 字号 评论关闭

题目翻译:

当一个广播电台在一个非常大的地区,广播站会用中继器来转播信号以使得每一个接收器都能接收到一个强烈的信号。然而,每个中继器必须慎重选择使用,使相邻的中继器不互相干扰。如果相邻的中继器使用不同的频道,那么就不会相互干扰。

由于无线电频道是一有限的,一个给定的网络所需的中继频道数目应减至最低。编写一个程序,读取一个中继网络,然后求出需要的最低的不同频道数。

代码:



#include<iostream>
using namespace std;

typedef class
{
	public:
		int next[27];  //直接后继
		int pn;   //next[]指针(后继个数)
}point;

int main(int i,int j,int k)
{
	int n;
	while(cin>>n)
	{
		if(!n)
			break;

		getchar();  //n的换行符

		point* node=new point[n+1];  //结点

		/*Structure the Map*/

		for(i=1;i<=n;i++)
		{
			getchar();  //结点序号
			getchar();  //冒号

			if(node[i].pn<0)   //初始化指针
				node[i].pn=0;

			char ch;
			while((ch=getchar())!='\n')
			{
				j=ch%('A'-1);   //把结点字母转换为相应的数字,如A->1  C->3
				node[i].next[ ++node[i].pn ]=j;
			}
		}

		int color[27]={0};  //color[i]为第i个结点当前染的颜色,0为无色(无染色)
		color[1]=1;  //结点A初始化染第1种色
		int maxcolor=1;  //当前已使用不同颜色的种数

		for(i=1;i<=n;i++)  //枚举每个顶点
		{
			color[i]=n+1;  //先假设结点i染最大的颜色
			bool vist[27]={false};  //标记第i种颜色是否在当前结点的相邻结点染过
			for(j=1;j<=node[i].pn;j++) //枚举顶点i的所有后继
			{
				int k=node[i].next[j];
				if(color[k])  //顶点i的第j个直接后继已染色
					vist[ color[k] ]=true;  //标记该种颜色
			}
			for(j=1;i<=n;j++)  //从最小的颜色开始,枚举每种颜色,最终确定结点i的染色
				if(!vist[j] && color[i]>j)
				{
					color[i]=j;
					break;
				}

			if(maxcolor<color[i])
				maxcolor=color[i];
		}

		if(maxcolor==1)
			cout<<1<<" channel needed."<<endl;
		else
			cout<<maxcolor<<" channels needed."<<endl;

		delete node;
	}
	return 0;
}


抱歉!评论已关闭.