POJ 1129 图的四色定理

来源:互联网 发布:体育网络电视 编辑:程序博客网 时间:2024/06/07 15:20



题目翻译:

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

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



代码:

#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->3node[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;elsecout<<maxcolor<<" channels needed."<<endl;delete node;}return 0;}



0 0