`
128kj
  • 浏览: 604484 次
  • 来自: ...
社区版块
存档分类
最新评论

POJ 1129-Channel Allocation 的贪心算法解法(图的m着色问题)

阅读更多
题目翻译:

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

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

建模:

  一个有N个节点的无向图,要求对每个节点进行染色,使得相邻两个节点颜色都不同,问最少需要多少种颜色?

那么题目就变成了一个经典的图的染色问题。

这题数据范围很小(节点最多26个),由四色定理可以得知最多需要4种颜色.

输入输出格式如下:(第一行是顶点数n,接下来n行表示每一个顶点与其它顶点的连接情况,当n=0时结束。对每一种情况输出对应的最小颜色数)
Sample Input

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

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

贪心算法http://128kj.iteye.com/blog/1684981。“贪心”算法的思想是首先  用第一种颜色对图中尽可能多的顶点着色(“尽可能多”表现出“贪心”);然后用第二种颜色对余下的顶点中尽可能多的顶点着色;如此等等,直到把所有的顶点都着完色。当用一种新颜色对余下的顶点着色时,我们采取下列步骤:

(1)选取某个未着色的顶点,并且用新颜色对它着色。

(2)扫描所有未着色的顶点集,对其中的每个顶点,确定它是否与已着新颜色的任何顶点相邻。若不相邻,则用新颜色对它着色。

import java.util.Scanner;
import java.util.Arrays;

public class Main{
 
 int n;//顶点数
 int[] color;//color[k]=m表示第k个顶点着色m
 int[][] c;//邻接矩阵

 public Main(int n,int[][]c){
    this.n=n;
    this.c=c;
    color=new int[n+1];
 }

 private boolean ok(int k,int r)//判断顶点k的着色是否发生冲突
{
   
    for(int i=1;i<n;i++){
        if(color[i]!=r) continue;
        if(c[k][i]==1&&color[i]==r )
            return true;
    }
    return false;
}

 private int  graphcolor()
{
    for(int i=1;i<=n;i++)
        color[i]=0;//初始化
    int k=1,m=0,sum=0;
    while(sum<n){
            m++;
        for(int i=1;i<=n;i++){
          if(color[i]==0){
                k=i;
                color[k]=m;
                sum++;
                break;
          }
         }
         
         for(int i=k+1;i<=n;i++){
            if(color[i]!=0) continue;
            if (ok(i,m)) continue;
            else {
             color[i]=m;
             sum++;
              
            }
        }
      
     }
   
    return m;
}
public static void main(String rgs[]) throws Exception
    {  
        Scanner cin = new Scanner(System.in);
        int n=cin.nextInt();
         

        while(n!=0){  
           int[][] g=new int[n+1][n+1];          
            for(int i=0;i<=n;i++)
                Arrays.fill(g[i],0);        
            for(int i=1;i<=n;i++){
                String s = cin.next();
                for(int j=2;j< s.length();j++)
                    g[i][s.charAt(j)-'A'+1]=1;
                 
            }
            Main gc=new Main(n,g);
            int count=gc.graphcolor();
            if(count==1)
                System.out.println(count+" channel needed.");
            else
                System.out.println(count+" channels needed.");
           n=cin.nextInt();
        }
    }


}

下载源码:
分享到:
评论

相关推荐

    POJ1129-Channel Allocation【四色定理】

    标题中的“POJ1129-Channel Allocation”是指一个编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Online Judge)。这个题目涉及到“四色定理”,...可能的算法包括但不限于回溯搜索、贪心算法或者图着色算法。

    POJ2002-Squares

    总的来说,"POJ2002-Squares"是一个结合了数学、算法和编程实践的学习资源,对于提升编程技能和解决问题的能力非常有帮助。通过深入研究解题报告和AC代码,可以学习到如何有效地处理和求解这类问题,从而在未来的...

    POJ3253-POJ3253-Fence Repair【STL优先队列】

    标题“POJ3253-POJ3253-Fence Repair【STL优先队列】”指的是一个在线编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Online Judge)。该题目要求参赛者使用C++编程语言解决特定的问题,并且在解决方案中...

    POJ1426-Find The Multiple【BFS+同余模】

    【标题】"POJ1426-Find The Multiple【BFS+同余模】"是一道来源于北京大学在线编程平台POJ的算法题目,主要涉及到了广度优先搜索(BFS)与同余模运算的知识点。这道题目要求解决的是寻找一个整数的倍数问题,可能...

    poj 1000 - 2000 部分题目 官方分类

    在POJ的题目中,贪心策略常用于解决资源分配、任务调度等问题。 6. **回溯与分支限界**:这类题目涉及到深度优先搜索和广度优先搜索,以及如何有效地剪枝来避免无效计算。 7. **图算法**:图论是计算机科学中的一...

    POJ3020-Antenna Placement

    解决这类问题可能需要用到搜索算法(如深度优先搜索、广度优先搜索)、动态规划、贪心策略,甚至是数学建模。具体解题策略则需要查看解题报告和源代码才能得知。 总的来说,这个压缩包提供了从问题理解到解决方案的...

    POJ1010-STAMPS

    2. "POJ1010-STAMPS.doc":这是一个文档文件,很可能包含了对问题的详细解释、解题思路、算法流程图、时间复杂度分析等内容,对于学习和理解这个问题的解法非常有帮助。 综合以上信息,我们可以推断,"POJ1010-...

    POJ3308-Paratroopers 【Dinic算法求最大流】

    【二分图顶点覆盖-&gt;最小割-&gt;最大流-&gt;Dinic算法求解】 解题报告+AC代码 http://hi.csdn.net/!s/WKVPR0 ----&gt; 我的所有POJ解题报告 http://blog.csdn.net/lyy289065406/article/details/6642573

    POJ1258-Agri-Net【Prim】

    普里姆算法是一种贪心算法,它从一个顶点开始,逐步扩展最小生成树,每次添加一条与当前生成树连接且权值最小的边。以下是算法的基本步骤: 1. 初始化:选择图中的任意一个顶点作为初始最小生成树的一部分。 2. 建立...

    POJ1837-Balance

    1. "POJ1837-Balance.cpp":这是使用C++语言编写的源代码文件,其中包含了解决"POJ1837-Balance"问题的算法和程序。通过阅读代码,我们可以了解具体的编程实现细节,如数据结构的选择、算法流程、变量定义等。 2. ...

    北大POJ初级-基本算法

    5. **贪心算法**:对于一些局部最优的选择可以导致全局最优解的问题,如霍夫曼编码、Prim算法和Kruskal算法等。 6. **图论算法**:包括图的遍历(深度优先搜索和广度优先搜索)、最短路径问题(Dijkstra算法、Floyd...

    POJ1201-Intervals

    代码中可能会用到动态规划、贪心算法等策略,以求在满足题目要求的同时,保证算法的时间复杂度尽可能低,从而在POJ平台上获得AC状态。而解题报告则会详细解释这些算法的应用和选择原因,以及代码的具体实现细节。

    POJ3414-Pots

    标题“POJ3414-Pots”是一个编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Online Judge)。这个题目主要考察的是算法设计和实现能力,通常涉及计算机科学中的数据结构和算法知识。 解题报告是参赛者在...

    POJ1003-Hangover

    根据题目"POJ1003-Hangover"的特性,我们可以推测这可能是一个涉及数据结构、算法或者数学逻辑的问题。在实际的解题过程中,参赛者可能需要理解题目的具体要求,例如处理输入输出、解决特定的计算问题或者设计有效的...

    POJ2503-Babelfish

    2. "POJ2503-Babelfish.doc":这可能是一个Microsoft Word文档,通常用于存储解题报告,包括问题解析、算法设计、代码解释、运行结果以及可能的优化建议等。 结合这些信息,我们可以推测"POJ2503-Babelfish"可能是...

    POJ3122-Pie

    解题时,程序员可能需要理解问题背后的数学模型,然后选择合适的数据结构(如链表、队列、栈、树等)和算法(如动态规划、贪心、回溯等)来求解。例如,如果问题是关于分割圆饼,可能需要处理角度计算和分配的问题;...

    北大POJ初级-图算法

    【北大POJ初级-图算法】是一系列针对北京大学在线编程平台POJ(Problem Online Judge)上的初级编程题目,重点在于图论算法的应用。这个解题报告集合了多种图算法的实现,帮助学习者掌握如何在实际问题中运用这些...

    POJ3080-Blue Jeans

    【标题】"POJ3080-Blue Jeans" 是北京大学在线编程平台POJ(Problem Online Judge)上的一道算法竞赛题目。这道题目主要考察的是动态规划和数组处理的能力,是许多编程爱好者和竞赛选手在提升算法技能时会遇到的经典...

    田忌赛马: POJ 2287(贪心解法)

    这就是一个典型的贪心问题,因为我们可以尽可能地选择当前最优的策略,即让最快的马去参加每一轮比赛。 在解答此题时,首先我们要对马的速度进行排序,然后按照贪心的原则,让速度最快的马去参加第一场比赛,第二快...

Global site tag (gtag.js) - Google Analytics