zoukankan      html  css  js  c++  java
  • Channel Allocation_四色定理

    Description

    When a radio station is broadcasting over a very large area, repeaters are used to retransmit the signal so that every receiver has a strong signal. However, the channels used by each repeater must be carefully chosen so that nearby repeaters do not interfere with one another. This condition is satisfied if adjacent repeaters use different channels. 

    Since the radio frequency spectrum is a precious resource, the number of channels required by a given network of repeaters should be minimised. You have to write a program that reads in a description of a repeater network and determines the minimum number of channels required.

    Input

    The input consists of a number of maps of repeater networks. Each map begins with a line containing the number of repeaters. This is between 1 and 26, and the repeaters are referred to by consecutive upper-case letters of the alphabet starting with A. For example, ten repeaters would have the names A,B,C,...,I and J. A network with zero repeaters indicates the end of input. 

    Following the number of repeaters is a list of adjacency relationships. Each line has the form: 

    A:BCDH 

    which indicates that the repeaters B, C, D and H are adjacent to the repeater A. The first line describes those adjacent to repeater A, the second those adjacent to B, and so on for all of the repeaters. If a repeater is not adjacent to any other, its line has the form 

    A: 

    The repeaters are listed in alphabetical order. 

    Note that the adjacency is a symmetric relationship; if A is adjacent to B, then B is necessarily adjacent to A. Also, since the repeaters lie in a plane, the graph formed by connecting adjacent repeaters does not have any line segments that cross. 

    Output

    For each map (except the final one with no repeaters), print a line containing the minumum number of channels needed so that no adjacent channels interfere. The sample output shows the format of this line. Take care that channels is in the singular form when only one channel is required.

    Sample Input

    2
    A:
    B:
    4
    A:BC
    B:ACD
    C:ABD
    D:BC
    4
    A:BCD
    B:ACD
    C:ABD
    D:ABC
    0

    Sample Output

    1 channel needed.
    3 channels needed.
    4 channels needed. 

    【题意】给出n个点,再给出n个点各自相邻的点,相邻的点不能是一个颜色,问至少需要几个颜色;

    【思路】

    对点i的染色操作:从最小的颜色开始搜索,当i的直接相邻(直接后继)结点已经染过该种颜色时,搜索下一种颜色。

    就是说i的染色,当且仅当i的临近结点都没有染过该种颜色,且该种颜色要尽可能小。

    参考:http://www.cnblogs.com/lyy289065406/archive/2011/07/31/2122590.html

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    typedef class
    {
        public:
        int next[30];
        int num;
    }point;
    int main()
    {
        int n;
        while(~scanf("%d",&n),n)
        {
            getchar();//回车
            point* a=new point[n+1];
            for(int i=1;i<=n;i++)
            {
                getchar();//当前的点
                getchar();//冒号
                if(a[i].num<0)
                {
                    a[i].num=0;//初始化
                }
                char ch;
                while((ch=getchar())!='
    ')
                {
                    int tmp=ch%('A'-1);//与当前的点相邻的点A->1,B->2...
                    a[i].next[++a[i].num]=tmp;//存入a[i]的next数组中
                }
            }
            int color[30];
            memset(color,0,sizeof(color));
            color[1]=1;//第一点一定需要一种颜色
            int maxcolor=1;//至少需要一种颜色
           for(int i=1;i<=n;i++)
            {
                color[i]=n+1;//先把第i个点的颜色置为最大
                int vis[30];
                memset(vis,false,sizeof(vis));
                for(int j=1;j<=a[i].num;j++)
                {
                    int k=a[i].next[j];//第i个点的第j个相邻的点
                    if(color[k]) vis[color[k]]=true;//如果他已经有颜色的话,就把那种颜色标记为true;
                }
                for(int j=1;i<=n;j++)
                {
                    if(!vis[j]&&color[i]>j)//如果j种颜色没用过,并且小于color[i]就把color[i]赋值为j;
                    {
                        color[i]=j;
                        break;
                    }
                }
                for(int i=1;i<=n;i++)
                {
                    if(maxcolor<color[i])
                    {
                        maxcolor=color[i];
    
                    }
                    if(maxcolor==4) break;//最大的颜色不超过四种,根据四色定理
                }
    
    
    
            }
    
            if(maxcolor==1)
                printf("1 channel needed.
    ");
            else printf("%d channels needed.
    ",maxcolor);
    delete a;
        }
    
        return 0;
    }
  • 相关阅读:
    VS2013 调试窗口一闪而过的解决方法
    什么是文件?
    局部变量和全局变量的区别
    一个简单java程序的要素
    运行一个简单的Java程序
    Javascript 构造函数原型继承机制
    函数式编程之一等公民的函数
    弹性布局flex-兼容问题
    TypeScript中的枚举类型
    依赖注入
  • 原文地址:https://www.cnblogs.com/iwantstrong/p/6017827.html
Copyright © 2011-2022 走看看