像C++语言一样,java中,也有包装好的优先队列类PriorityQueue。

用法如下(模板代码):

工作安排问题:

问题描述:设有n件工作分配给n个人,将工作i分配给第j个人所需的费用为cij。试设计一个算法,为每个人都分配一件不同的工作,并使得总费用达到最小。

输入:第1行有1个正整数n(1≤n≤20),接下来的n行,每行n个数,表示工作费用。

输出:计算的最小总费用

样例输入:                  样例输出:

3                            9

10  2  3

2   3   4

3   4   5

使用优先级分支限界的方法,很容易解决这道题目,但是在写代码的过程中,是很容易出现错误,因此需要注意!!!。

package com.KongLong;

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner; class Money
{
int CurrentMoney;//当前费用;
int PossibleMoney;//当前结点可能最小的费用
int locat;//当前的行坐标
boolean vis[] = new boolean[25];
}
class Cmp implements Comparator<Money>//优先级排序
{
public int compare(Money o1, Money o2)
{
if(o1.PossibleMoney > o2.PossibleMoney)
{
return 1;
}
else if(o1.PossibleMoney == o2.PossibleMoney)
{
return 0;
}
else
{
return -1;
}
}
}
public class Main
{
static int N;
static final int MAX = 25;
static int money[][] = new int[MAX][MAX];//邻接矩阵
static Money M[] = new Money[MAX];//在队列中使用
static int cnt = 0;
static Queue<Money> que = new PriorityQueue<Money>(MAX,new Cmp());//优先队列
static int result;
public static void main(String []args)
{
init();
Scanner cin = new Scanner(System.in);
N = cin.nextInt();
cnt = 0;
result = 99999999;
for(int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
{
money[i][j] = cin.nextInt();
}
}
for(int i = 0; i < N; i++)
{
M[cnt].CurrentMoney = money[0][i];
M[cnt].locat = 0;
M[cnt].vis[i] = true;
M[cnt].PossibleMoney = M[cnt].CurrentMoney+Bound(1);
//System.out.println(M[cnt].PossibleMoney);
que.add(M[cnt]);
cnt++;
}
while(!que.isEmpty())//队列为空判断
{
Money a = new Money();
a = que.poll();
//System.out.println(a.CurrentMoney + ">>>>>>> " + a.PossibleMoney + ">>> " + a.locat);
if(a.locat == N-1 && a.CurrentMoney < result)//界限
{
result = a.CurrentMoney;
//System.out.println("000");
continue;
}
else if(a.locat == N-1)//界限
{
continue;
}
else if(a.PossibleMoney > result)//剪枝
{
break;
}
for(int i = 0; i < N; i++)
{
if(a.vis[i] == true)
{
continue;
}
M[cnt].CurrentMoney = a.CurrentMoney+money[a.locat+1][i];
M[cnt].vis[i] = true;
for(int j = 0; j < N; j++)
{
if(a.vis[j] == true)
{
M[cnt].vis[j] = true;
}
//System.out.println(M[cnt].vis[j]);
}
M[cnt].locat = a.locat+1;
M[cnt].PossibleMoney = M[cnt].CurrentMoney+Bound(a.locat+2);
//System.out.println(M[cnt].CurrentMoney + " >>>>>>>>>>> " + M[cnt].PossibleMoney + " yyyyy ");
//M[cnt].vis[i] = true;
que.add(M[cnt]);
cnt++;
}
}
System.out.println(result);
}
static int Bound(int j)//当前结点的最小费用
{
int sum = 0;
for(int i = j; i < N; i++)
{
int Min = 99999999;
for(int k = 0; k < N; k++)
{
if(M[cnt].vis[k] == true)
{
//System.out.println(k + "k");
continue;
}
Min = Math.min(Min, money[i][k]);
}
sum += Min;
}
//System.out.println(j + "///// " + sum);
return sum;
}
static void init()
{
for(int i = 0; i < MAX; i++)
{
M[i] = new Money();
}
}
}
在写这段代码过程中,注意需要用一个数组保存队列,否则容易出现错误。

java,优先队列的用法的更多相关文章

  1. Java优先队列PriorityQueue的各种打开方式以及一些你不知道的细节

    目录 Java优先队列PriorityQueue的各种打开方式以及一些你不知道的细节 优先队列的默认用法-从小到大排序 对String类用优先队列从大到小排序 通过自定义比较器对自定义的类进行从小到大 ...

  2. JAVA的continue用法

    JAVA的continue用法: public class test{ public static void main(String [] args){  for(int i=0;i<=10;i ...

  3. Java Spring AOP用法

    Java Spring AOP用法 Spring AOP Java web 环境搭建 Java web 项目搭建 Java Spring IOC用法 spring提供了两个核心功能,一个是IoC(控制 ...

  4. Java Spring IOC用法

    Java Spring IOC用法 Spring IoC 在前两篇文章中,我们讲了java web环境搭建 和 java web项目搭建,现在看下spring ioc在java中的运用,开发工具为In ...

  5. 四种Java线程池用法解析

    本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 执行一个异步任务你还只是如下 ...

  6. JAVA中ArrayList用法

    JAVA中ArrayList用法 2011-07-20 15:02:03|  分类: 计算机专业 |  标签:java  arraylist用法  |举报|字号 订阅     Java学习过程中做题时 ...

  7. this在java中的用法

    this在java中的用法 1.使用this关键字引用成员变量 作用:解决成员变量与参数或局部变量命名冲突的问题 public class Dog { String name; public Dog( ...

  8. java assert的用法简介【转】

    assert的基本用法 assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制,如C,C++和Eiffel等,但是支持的形式不尽相同,有的是通过语言本身.有的是通过库 ...

  9. java Arrays.asList用法

    java Arrays.asList用法 用途 Arrays是java容器相关操作的工具类,asList方法将Array转换为list,是Array和List之间的桥梁. 注意 Arrays.asLi ...

随机推荐

  1. IconFont --阿里巴巴矢量库

    超多的图标网站,可自己设置颜色,然后下载. IconFont --阿里巴巴矢量库

  2. Mybatis 元素内容必须由格式正确的字符数据或标记组成

    一个web应用,框架为SpringMVC Spring Mybatis ,昨天写了一下午的代码,因为逻辑较大,期间也没测,打算写完这个功能点在进行测试,谁知道写完的时候,tomcat根本启动不起来了, ...

  3. SSIS Hekaton In-Memory OLTP 【翻译一篇外国文章】

    来自:http://www.itprotoday.com/microsoft-sql-server/important-new-features-sql-server-2014 Microsoft's ...

  4. dede织梦手机站m文件夹功能基础详解

    织梦2015年6月8日更新后,就添加了很多针对手机移动端的设计,最大的设计就是添加了生成二维码的织梦标签和织梦手机模板功能,织梦更新后,默认的 default模板中就包含手机模板,所以我们可以给织梦网 ...

  5. 创建 Visual Studio 2017 离线安装

    代码示例: vs_Enterprise.exe --layout E:\VS2017LAYOUT --add Microsoft.VisualStudio.Workload.NetCoreTools ...

  6. 在自定义目录下,按日期创建excel文件

    在指定文件目录下,新建以当前日期命名的excel 文件,如果文件已经存在,在文件中新建一个sheet页来存放数据 import datetime import xlrd, xlwt import re ...

  7. react中对于key值的理解

    1.key是用来帮助react识别哪些内容被更改.添加或者删除.key需要写在用数组渲染出来的元素内部,并且需要赋予其一个稳定的值.如果key值发生了变更,react则会触发UI的重渲染. 2.在相邻 ...

  8. java基础——IO流之File类

    1.File类的构造方法: File(String  pathName):通过一个指定的字符串类型路径来创建一个文件对象 File  (String parent,String child):通过指定 ...

  9. 前后端通信中使用Ajax与后台接口api交互(以登录功能为例)

    一.查阅开发文档 首先,要做这个功能前,我们必须先查阅后台接口文档,了解使用登录接口时,需要提交哪些参数,并且接口使用返回的数据. 这里我使用了一个返回json格式数据的登录接口为例,讲解怎么使用Aj ...

  10. Docker初始

    如今Docker的使用已经非常普遍,特别在一线互联网公司.使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力.在云服务概念兴起之后,Docker的使用场景和范围进一步发展,如 ...