像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. Git 撤销到某个版本的代码

    Git checkout 版本号 文件名带路径的

  2. elastic-job集成到springboot教程,和它的一个异常处理办法:Sharding item parameters '1' format error, should be int=xx,int=xx

    先说这个Sharding item parameters '1' format error, should be int=xx,int=xx异常吧,这是在做动态添加调度任务的时候出现的,网上找了一会没 ...

  3. zuul 自定义路由规则

    1,zuul的maven配置 <!--spring cloud 相关包--><parent> <groupId>org.springframework.boot&l ...

  4. javascript学习-基本类型

    javascript学习-基本类型 1.概述 javascript的数据类型大体上分两种:基本类型和对象类型.简单的区分就是基本类型是无法再分的原子级类型:对象类型是容器,可以容纳基本类型和对象类型. ...

  5. 【JavaScript】轮播图

    代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <tit ...

  6. Hunspell介绍及试用

    1.简介 Hunspell是一个为拥有多态和复杂组合词的语言所设计的拼写检查器,原本为匈牙利语设计. Hunspell是一个自由软件,在GPL.LGPL和MPL三许可证下发行. Hunspell对主要 ...

  7. jqGrid实现表头自动换行

    当jqGrid表头内容过多无法全部展示时,添加以下css实现表头自动换行. <style type="text/css"> /* jqgrid 表头自动换行 */ th ...

  8. vue中路由跳转的底层原理

    前端路由是直接找到与地址匹配的一个组件或对象并将其渲染出来.改变浏览器地址而不向服务器发出请求有两种方式: 1. 在地址中加入#以欺骗浏览器,地址的改变是由于正在进行页内导航 2. 使用H5的wind ...

  9. 神经机器翻译 - NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE

    论文:NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE 综述 背景及问题 背景: 翻译: 翻译模型学习条件分布 ...

  10. linux 启动流程

    启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬 ...