ZOJ-1084-Channel Allocation

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1084

任务:根据读取的转发器网络的描述信息,求出所需频道的最小使用量

算法分析:本题的转发器网络相当于一个无向图,临近的转发器使用不同的频道相当于无向图的着色问题。相对此题最多需要4中颜色。

当只有一个结点时,只需一种颜色。

否则依次用2和3去求解,如果可以成功,则为求解结果,否则最后结果为4

着色用深度优先搜索进行

View Code
#include<stdio.h>

#include<string.h>



int n,map[27][27],used[27];



int dfs(int id,int color)

{

    int i,j,flag;

    for(i=1;i<=color;i++)

    {

        used[id]=i;    //对结点id着色为i

        flag = 1;

        for(j=1;j<id;j++)

        {

            if(map[j][id]&&used[j]==used[id])//改颜色已经使用过了

            {

                flag = 0;    break;

            }

        }

        //改颜色有效,当所有结点着色完毕返回true,或者给下一个结点着色

        if(flag && (id == n || dfs(id+1,color)))

            return 1;

    }

    return 0;

}



int main()

{

    char str[30];

    int i,j,one;

    while(scanf("%d",&n)!=EOF&&n)

    {

        one = 1;

        memset(map,0,sizeof(map));

        for(i=1;i<=n;i++)

        {

            scanf("%s",str);

            for(j=2;str[j];j++,one = 0)

                map[i][str[j]-'A'+1] = map[str[j]-'A'+1][i] = 1;

        }

        used[1]=1;

        if(one)    printf("1 channel needed.\n");

        else if(dfs(2,2))    printf("2 channels needed.\n");

        else if(dfs(2,3))    printf("3 channels needed.\n");

        else printf("4 channels needed.\n");

    }

    return 0;

}
View Code
#include<stdio.h>

#include<string.h>



int n,map[27][27],used[27];

int flag;

void dfs(int id,int color)

{

    if(id>n)

    {

        flag = 1;    return ;

    }

    if(!flag)

    {

        int i,j,ok;

        for(i=1;i<=color;i++)

        {

            used[id]=i;    ok = 1;

            for(j=1;j<id;j++)

            {

                if(map[j][id]&&used[j]==used[id])

                {

                    ok = 0;        break;

                }

            }

            if(ok)    dfs(id+1,color);

        }

    }

}



int main()

{

    char str[30];

    int i,j,one;

    while(scanf("%d",&n)!=EOF&&n)

    {

        one = 1;

        memset(map,0,sizeof(map));

        for(i=1;i<=n;i++)

        {

            scanf("%s",str);

            for(j=2;str[j];j++,one = 0)

                map[i][str[j]-'A'+1] = map[str[j]-'A'+1][i] = 1;

        }

        used[1]=1;

        flag = 0;

        if(one)    printf("1 channel needed.\n");

        else

        {

            dfs(2,2);

            if(flag)    printf("2 channels needed.\n");

            else

            {

                dfs(2,3);

                if(flag)    printf("3 channels needed.\n");

                else printf("4 channels needed.\n");

            }

        }

    }

    return 0;

}

 

你可能感兴趣的:(location)