`

编程之美-高效地安排会议 图着色问题 贪心算法

 
阅读更多

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class GraphColoringProblem {

	/**编程之美 高效地安排会议 图着色问题 贪心算法
	 * 假设要用很多个教室对一组活动进行调度。我们希望使用尽可能少的教室来调度所有的活动。请给出一个有效的贪心算法,来确定哪一个活动应使用哪一个教室。
	 * (这个问题也被成为区间图着色(interval-graph coloring)问题。我们可作出一个区间图,其顶点为已知的活动,其边连接着不兼容的活动。
	 * 为使任两个相邻结点的颜色均不相同,所需的最少颜色对应于找出调度给定的所有活动所需的最少教室数。)
	 * see
	 * http://renren.it/a/caozuoxitong/OS/20120626/176363.html
	 */
	public static void main(String[] args) {
		List<Meeting> list=new ArrayList<Meeting>();
		Random random=new Random();
		for(int i=0;i<10;i++){
			int begin=random.nextInt(10)+1;
			int end=begin+(random.nextInt(10)+1);
			Meeting meeting=new Meeting(begin,end);
			list.add(meeting);
		}
		GraphColoringProblem gcp=new GraphColoringProblem();
		gcp.smartManagment(list);
	}

	public void smartManagment(List<Meeting> list){
		if(list==null||list.size()<2){
			return;
		}
		printList(list);
		Collections.sort(list);
		printList(list);
		List<List<Meeting>> outerList=new ArrayList<List<Meeting>>();
		while(list.size()!=0){
			int size=list.size();
			List<Meeting> listOfOneRoom=new ArrayList<Meeting>();
			Meeting current=list.get(0);
			listOfOneRoom.add(current);
			for(int i=1;i<size;i++){
				Meeting candidate=list.get(i);
				if(candidate.begin>=current.end){
					listOfOneRoom.add(candidate);
					current=candidate;
				}
			}
			outerList.add(listOfOneRoom);
			list.removeAll(listOfOneRoom);
		}
		//meetings that can be held in the same room are printed in one line:
		for(int i=0,size=outerList.size();i<size;i++){
			printList(outerList.get(i));
		}
	}
	
	static class Meeting implements Comparable<Meeting>{
		int begin;
		int end;
		Meeting(int begin,int end){
			this.begin=begin;
			this.end=end;
		}
		public int compareTo(Meeting o) {
			int endCmp=this.end-o.end;
			if(endCmp==0){
				return this.begin-o.begin;
			}
			return endCmp;
		}
		public String toString(){
			return "["+begin+","+end+"]";
		}
	}
	
	public static void printList(List<Meeting> list){
		if(list==null||list.size()==0){
			return;
		}
		for(int i=0,size=list.size();i<size;i++){
			System.out.print(list.get(i));
		}
		System.out.println();
	}
}

0
13
分享到:
评论

相关推荐

    图着色问题 贪心法-C语言

    在提供的“图着色问题 贪心法.cpp”文件中,应该包含了具体的C语言实现代码,包括定义图结构、读取图数据、实现贪心算法以及输出结果等功能。通过分析和理解这段代码,可以深入学习如何在实际编程中运用贪心算法解决...

    graph_coloring.zip_matlab 图着色_图着色_图着色 matlab_节点着色_贪心

    同时,由于图着色问题属于NP完全问题,即使对于贪心算法,对于某些特定的图结构也可能无法达到最优解。然而,贪心算法在许多情况下可以得到接近最优的结果,并且具有较低的时间复杂性,因此在实际应用中仍具有很高的...

    活动安排问题 贪心算法

    ### 活动安排问题与贪心算法 在IT领域,特别是计算机科学中,贪心算法是一种非常重要的解决策略,广泛应用于多种优化问题之中。其中一个典型的应用案例是“活动安排问题”。该问题的核心在于如何有效地分配有限资源...

    算法(c++)——地图着色问题.rar

    在这个名为“ShiYan4_DiTuZhuSeWenTi”的示例项目中,可能包含了具体的C++代码实现,通过阅读和分析这段代码,你可以更深入地了解如何在实际编程中解决地图着色问题。这不仅锻炼了你的逻辑思维能力,也加深了对图论...

    贪心算法之会场安排问题(算法设计)

    设计一个有效的贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。) 编程任务: 对于...

    Qt实现图的动态着色,使用了贪心算法和蛮力法

    总之,这个项目展示了如何在Qt环境下结合C++编程语言,利用贪心算法和蛮力法解决图着色问题。通过分析提供的源代码文件,我们可以学习到如何构建一个交互式的图形应用,以及如何在实际问题中应用图论算法。

    贪心算法会场安排问题算法设计分析.pdf

    贪心算法会场安排问题算法设计分析是对图着色问题的一种解决方案,旨在使用尽可能少的会场来安排一批活动。该问题的核心思想是将每一个活动作为图的一个顶点,不相容活动间用边相连,使相邻顶点着有不同颜色的最小...

    算法分析 递归与分治策略 动态规划 贪心算法 分支限界法 随机化算法等算法

    在IT领域,算法是解决问题的核心工具,而递归与分治策略、动态规划、贪心算法、回溯法、分支限界法以及随机化算法都是其中的重要组成部分。这些算法不仅适用于计算机科学,也在数据结构、优化问题和复杂计算中扮演着...

    贪心算法总结

    在ACM(国际大学生程序设计竞赛)中,贪心算法是必不可少的知识点,因为它能有效地处理一些复杂的问题,并且在实际生活中也有广泛的应用。 贪心算法的核心思想是在每一步选择中都采取当前状态下最好或最优的选择,...

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

    标题“POJ 1129-Channel Allocation”的问题是一个典型的图论问题,涉及到贪心算法和图的m着色问题。在这个问题中,我们假设有一个通信网络,其中的节点代表基站,每个基站需要分配一个频道来传输信号,而两个相邻的...

    基于Java的中国地图着色演示程序

    通过这个项目,学习者不仅可以掌握Java编程技术,还能深入理解图论、回溯法等理论知识,并锻炼解决问题和优化算法的能力。同时,项目的可视化界面也提供了一个直观的教育工具,帮助人们更好地理解抽象的算法概念。

    算法设计与分析课程设计论文-骑士问题、图着色问题、离散帝国竞争算法

    标题所涉及的知识点涵盖了算法设计与分析中的几个经典问题:骑士问题、图着色问题、以及离散帝国竞争算法。接下来将详细说明这些知识点。 首先,骑士问题通常也被称为骑士巡逻问题或骑士巡游问题,它是图论中哈密顿...

    Compiler-Register-Allocator-master_寄存器分配C图着色_warm7a5_

    "Compiler-Register-Allocator-master_寄存器分配C图着色_warm7a5_" 这个项目显然关注的是如何在C语言环境中实现一个高效的寄存器分配算法,特别是采用了图着色法。 寄存器分配的目标是减少程序执行时对内存的依赖...

    算法课件 递归与分治 贪心算法

    在IT领域,算法是解决问题的核心工具,而"算法课件 递归与分治 贪心算法"这个主题涵盖了编程中几个至关重要的算法概念。这些算法思想在软件开发、数据处理、人工智能等多个领域都有广泛应用。 首先,让我们深入探讨...

    连通图着色问题 程序以及报告

    在计算机科学中,图着色问题可以应用于资源分配、时间表安排等领域。 解决连通图着色问题通常采用回溯法或贪心策略。回溯法是一种试探性的解决问题的方法,它尝试分步构造解决方案,并在每一步中检查当前解是否可行...

    数据结构 地图着色

    数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和组织数据,以便于执行各种操作。在本课程设计“地图着色”中,我们将深入探讨如何利用数据结构解决实际问题,特别是地理信息处理和图论的问题。这个课题...

    计算机算法设计与分析实验报告及源码,包含分治算法、贪心算法、动态规划算法、回溯算法等,C语言实现

    典型的应用包括八皇后问题和图的着色问题。回溯算法可以穷举所有可能的解决方案,直到找到满足条件的解。虽然效率较低,但在搜索空间相对较小或问题有约束的情况下,回溯算法仍是一种实用的策略。 C语言作为一种...

    回溯和贪心算法, for study only

    贪心算法并不考虑整个问题的全局最优解,而是每次只关心局部最优解,希望这些局部最优解能自然地导向全局最优。这种算法通常适用于可以分解为多个独立部分的问题,每个部分的最优解可以独立于其他部分求得。然而,...

    动态规划,分治算法,概率算法,模拟退火算法,搜索算法,贪婪算法,网上matlab,遗传算法,组合算法

    在计算机科学领域,优化问题和复杂计算任务的解决往往依赖于高效的算法。这些算法通过不同的策略来找到问题的最优解或近似解。本篇文章将深入探讨标题和描述中提到的一些核心算法,包括动态规划、分治算法、概率算法...

    动态规划算法 贪心算法 回溯法实验文档.zip

    在计算机科学领域,算法是解决问题的关键工具,动态规划、贪心算法和回溯法是三种常用的算法策略。本文档集合将深入探讨这三种算法,并通过源码软件进行实践,帮助理解其工作原理和应用场景。 首先,动态规划...

Global site tag (gtag.js) - Google Analytics