java,优先队列的用法
像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,优先队列的用法的更多相关文章
- Java优先队列PriorityQueue的各种打开方式以及一些你不知道的细节
目录 Java优先队列PriorityQueue的各种打开方式以及一些你不知道的细节 优先队列的默认用法-从小到大排序 对String类用优先队列从大到小排序 通过自定义比较器对自定义的类进行从小到大 ...
- JAVA的continue用法
JAVA的continue用法: public class test{ public static void main(String [] args){ for(int i=0;i<=10;i ...
- Java Spring AOP用法
Java Spring AOP用法 Spring AOP Java web 环境搭建 Java web 项目搭建 Java Spring IOC用法 spring提供了两个核心功能,一个是IoC(控制 ...
- Java Spring IOC用法
Java Spring IOC用法 Spring IoC 在前两篇文章中,我们讲了java web环境搭建 和 java web项目搭建,现在看下spring ioc在java中的运用,开发工具为In ...
- 四种Java线程池用法解析
本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 执行一个异步任务你还只是如下 ...
- JAVA中ArrayList用法
JAVA中ArrayList用法 2011-07-20 15:02:03| 分类: 计算机专业 | 标签:java arraylist用法 |举报|字号 订阅 Java学习过程中做题时 ...
- this在java中的用法
this在java中的用法 1.使用this关键字引用成员变量 作用:解决成员变量与参数或局部变量命名冲突的问题 public class Dog { String name; public Dog( ...
- java assert的用法简介【转】
assert的基本用法 assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制,如C,C++和Eiffel等,但是支持的形式不尽相同,有的是通过语言本身.有的是通过库 ...
- java Arrays.asList用法
java Arrays.asList用法 用途 Arrays是java容器相关操作的工具类,asList方法将Array转换为list,是Array和List之间的桥梁. 注意 Arrays.asLi ...
随机推荐
- linux----------centos下添加环境变量
1.添加PHP的环境变量.如图操作 其中在 /etc/profile里面编辑的内容是:只加了这一行,箭头所指的那一行. 2.需要添加其他环境变量就在后面用 :追加 PATH=$PATH:/usr/lo ...
- 在嵌入式开发中应该这样理解嵌入式C编程
一.新手常常问的一个问题:C语言和嵌入式C编程有什么区别?而嵌入式工程师一般都会告诉你,其区别在于嵌入式的C语言是跑在嵌入式的开发板上的,CPU和电脑不一样,所以编译器也是不一样的,生成的可执行程序也 ...
- sql 生成随机字符串
生成三位随机字母+12位数字 ),), @c int; select @CardCode=abs(CHECKSUM(NEWID())) -LEN(@CardCode); ,@c)) set @Card ...
- echart的x换行
option = { legend: { y: 'bottom', data:['该业务正常类比例','该业务关注类比例','该业务不良类比例'] }, xAxis: { type: 'categor ...
- Recycle----项目总结
github项目地址:https://github.com/HuChengLing/recycle 软件规模: 我们这个Recycle app属于一个小型项目,整体规模不大.预期有垃圾回收和二手品交易 ...
- 如何在linux上查看tomcat的端口号
1.先到tomcat配置文件查看tomcat的端口是什么,配置文件一般是:$CATALINA_HOME/conf/server这个文件,查找<Connector port="8080& ...
- docker enable overlay2 quota on Centos 7
参考文档 docker overlay2的 --storage-opt 需要启动mount 参数中有pquota 参考上边的文档mount中的xfs 含有pquota 将 /etc/fstab 文件中 ...
- OO第二次博客作业—17373247
OO第二次博客作业 零.写在前面 OO第二单元宣告结束,在这个单元里自己算是真正对面向对象编程产生了比较深刻的理解,也认识到了一个合理的架构为编程带来的极大的便利. (挂三次评测分数 看出得分接近等差 ...
- 微服务化的大坑之一:当dubbo神器碰上共用注册中心和错误的暴露接口
dubbo是国内用比较多的微服务化系统,非侵入(意思就是说不用自己写代码,把xml配置好就可以用了,这个xml的引用注解就注在springboot的开启main类里面就可以了),提供好用的均衡和容错机 ...
- SAP 查询分析器,查询报表自动生成,SQL查询测试实现说明(转)
在日常的SAP开发和应用中,经常需要通过查询SAP数据表来处理日常业务,比如:数据对账.报表SQL测试.SAP查询功能开发等.通过开发SAP查询分析器,SAP实施和开发人员,可以在较短的时间内查询到需 ...