像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. linux----------centos下添加环境变量

    1.添加PHP的环境变量.如图操作 其中在 /etc/profile里面编辑的内容是:只加了这一行,箭头所指的那一行. 2.需要添加其他环境变量就在后面用 :追加 PATH=$PATH:/usr/lo ...

  2. 在嵌入式开发中应该这样理解嵌入式C编程

    一.新手常常问的一个问题:C语言和嵌入式C编程有什么区别?而嵌入式工程师一般都会告诉你,其区别在于嵌入式的C语言是跑在嵌入式的开发板上的,CPU和电脑不一样,所以编译器也是不一样的,生成的可执行程序也 ...

  3. sql 生成随机字符串

    生成三位随机字母+12位数字 ),), @c int; select @CardCode=abs(CHECKSUM(NEWID())) -LEN(@CardCode); ,@c)) set @Card ...

  4. echart的x换行

    option = { legend: { y: 'bottom', data:['该业务正常类比例','该业务关注类比例','该业务不良类比例'] }, xAxis: { type: 'categor ...

  5. Recycle----项目总结

    github项目地址:https://github.com/HuChengLing/recycle 软件规模: 我们这个Recycle app属于一个小型项目,整体规模不大.预期有垃圾回收和二手品交易 ...

  6. 如何在linux上查看tomcat的端口号

    1.先到tomcat配置文件查看tomcat的端口是什么,配置文件一般是:$CATALINA_HOME/conf/server这个文件,查找<Connector port="8080& ...

  7. docker enable overlay2 quota on Centos 7

    参考文档 docker overlay2的 --storage-opt 需要启动mount 参数中有pquota 参考上边的文档mount中的xfs 含有pquota 将 /etc/fstab 文件中 ...

  8. OO第二次博客作业—17373247

    OO第二次博客作业 零.写在前面 OO第二单元宣告结束,在这个单元里自己算是真正对面向对象编程产生了比较深刻的理解,也认识到了一个合理的架构为编程带来的极大的便利. (挂三次评测分数 看出得分接近等差 ...

  9. 微服务化的大坑之一:当dubbo神器碰上共用注册中心和错误的暴露接口

    dubbo是国内用比较多的微服务化系统,非侵入(意思就是说不用自己写代码,把xml配置好就可以用了,这个xml的引用注解就注在springboot的开启main类里面就可以了),提供好用的均衡和容错机 ...

  10. SAP 查询分析器,查询报表自动生成,SQL查询测试实现说明(转)

    在日常的SAP开发和应用中,经常需要通过查询SAP数据表来处理日常业务,比如:数据对账.报表SQL测试.SAP查询功能开发等.通过开发SAP查询分析器,SAP实施和开发人员,可以在较短的时间内查询到需 ...