像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. Centos7 关于防火墙的一些简单配置

    近期安装了linux系统Centos7,接触下来发现了与原来的Centos6.5有一些差别,这里主要记录下来我的一些关于Centos7防火墙的了解. 一.firewall简介 CentOS 7中防火墙 ...

  2. IDEA 201809 Jrebel安装破解

    jrebel介绍: JRebel是一款JAVA虚拟机插件,它使得JAVA程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响.JRebel使你能即时分别看到代码.类和资源的变化, ...

  3. 前端JS插件整理

    1.JQuery.js JavaScript 库,简化JS. 官网地址:https://jquery.com/ 菜鸟教程:http://www.runoob.com/jquery/jquery-tut ...

  4. awk if print

    awk  -F","  '{ if($4=="abc" && $5=="def"){print $1} else {prin ...

  5. Dataguard配置总结

    Dataguard配置总结 本例情形 在主库存在运行的情况下,增加配置dataguard备库,实现双机热备,高可用性. 主库要求,归档模式,强制归档. 主库idty 备库idty_st 1.密码文件 ...

  6. 网络-01-端口号-linux端口详解大全

    0 | 无效端口,通常用于分析操作系统1 | 传输控制协议端口服务多路开关选择器2 | 管理实用程序3 | 压缩进程5 | 远程作业登录7 | 回显9 | 丢弃11 | 在线用户13 | 时间17 | ...

  7. Java-对象及变量的并发访问小结

    1)多线程环境下,方法内的变量是线程安全的 2)多个线程同时处理一个实例,这个实例内的变量是不安全的 3)不同线程中注入同一个类的不同实例,实例中的变量是安全的 4)Synchronized获取到的锁 ...

  8. pandas 时间格式转换

    OUTLINE 常见的时间字符串与timestamp之间的转换 日期与timestamp之间的转换 常见的时间字符串与timestamp之间的转换 这里说的字符串不是一般意义上的字符串,是指在读取日期 ...

  9. linux中的strings命令

     strings - print the strings of printable characters in files.            意思是, 打印文件中可打印的字符.  我来补充一下吧 ...

  10. 第02节:JMS基本概念和模型

    1.JMS是什么 JMS Java Message Service,Java消息服务,是Java EE中的一个技术. 2.JMS规范 JMS定义了Java中访问消息中间件的接口,并没有机遇实现,实现J ...