当前位置: 首页 > news >正文

COMP3023 Design and Analysis of Algorithms

 一个学生作业,拿去吧,直接用

package com.xxl.job.executor.service.jobhandler;import java.io.*;
import java.util.*;public class DAG {public static void main(String[] args) throws IOException {// 读取输入文件 in.txtString inputInFile = "C:\\Users\\Administrator\\Desktop\\in.txt";BufferedReader reader = new BufferedReader(new FileReader(inputInFile));int fileN = Integer.parseInt(reader.readLine().trim());int[] uvs = Arrays.stream(reader.readLine().split("\\s+")).mapToInt(Integer::parseInt).toArray();int u = uvs[0], v = uvs[1];int[] weights = Arrays.stream(reader.readLine().split("\\s+")).mapToInt(Integer::parseInt).toArray();// 读取邻接矩阵并构建邻接表List<List<Integer>> listArrayList = new ArrayList<>();for (int i = 0; i < fileN; i++) {listArrayList.add(new ArrayList<>());int[] rows = Arrays.stream(reader.readLine().split("\\s+")).mapToInt(Integer::parseInt).toArray();for (int j = 0; j < fileN; j++) {if (rows[j] == 1) listArrayList.get(i).add(j);}}reader.close();// 拓扑排序List<Integer> topOrders = kahnTopoLogicalSort(listArrayList, fileN);// 动态规划计算最大路径long[] dps = new long[fileN];Arrays.fill(dps, Long.MIN_VALUE);dps[u] = weights[u];int[] prev = new int[fileN];Arrays.fill(prev, -1);for (int node : topOrders) {if (dps[node] == Long.MIN_VALUE) continue;for (int neighbor : listArrayList.get(node)) {if (dps[neighbor] < dps[node] + weights[neighbor]) {dps[neighbor] = dps[node] + weights[neighbor];prev[neighbor] = node;}}}// 输出结果到out.txt文件中String outputToOutFile = "C:\\Users\\Administrator\\Desktop\\out.txt";BufferedWriter writer = new BufferedWriter(new FileWriter(outputToOutFile));if (dps[v] == Long.MIN_VALUE) {writer.write("路径不存在,请检查后处理");} else {writer.write(dps[v] + "\n");List<Integer> paths = reconstructPath(prev, u, v);for (int i = 0; i < paths.size(); i++) {writer.write(paths.get(i) + (i < paths.size()-1 ? " " : ""));}}writer.close();}// Kahn算法 -- 拓扑排序private static List<Integer> kahnTopoLogicalSort(List<List<Integer>> intersection, int n) {// 初始化所有节点的入度数组,用于后续的拓扑排序int[] degrees = new int[n];// 遍历邻接表,统计每个节点的入度for (List<Integer> list : intersection) {for (int node : list) {degrees[node]++;}}// 使用队列来存储所有入度为0的节点,作为拓扑排序的起始节点Queue<Integer> q = new LinkedList<>();// 将所有入度为0的节点添加到队列中for (int i = 0; i < n; i++) {if (degrees[i] == 0) {q.add(i);}}// 用于存储拓扑排序结果的列表List<Integer> order = new ArrayList<>();// 当队列不为空时,进行拓扑排序while (!q.isEmpty()) {// 从队列中取出一个节点int u = q.poll();// 将该节点添加到拓扑排序结果中order.add(u);// 遍历该节点的所有邻接节点,并减少它们的入度for (int v : intersection.get(u)) {// 如果节点的入度减为0,则将其添加到队列中if (--degrees[v] == 0) {q.add(v);}}}// 返回拓扑排序结果return order;}private static List<Integer> reconstructPath(int[] prev, int u, int v) {// 创建一个列表用于存储从起点到终点的路径List<Integer> paths = new ArrayList<>();// 从终点v开始,通过prev数组回溯到起点,将路径中的顶点添加到path列表中for (int i = v; i != -1; i = prev[i]) {paths.add(i);}// 将路径反转,以便从起点到终点表示路径Collections.reverse(paths);// 如果路径的起点是u,则返回这条路径;否则返回空列表,表示没有找到有效的路径return paths.get(0) == u ? paths : Collections.emptyList();}
}

 in.txt文件内容

4
0 3
3 2 1 4
0 1 1 1
0 0 0 1
0 0 0 1
0 0 0 0

 (大环境真可怕,自己卷自己)

http://www.xdnf.cn/news/574255.html

相关文章:

  • ./build/mkfs.jffs2: Command not found
  • 车载诊断架构 --- LIN 节点 ECU 故障设计原则
  • C++继承:从生活实例谈面向对象的精髓
  • 零基础设计模式——创建型模式 - 生成器模式
  • 时源芯微|六大步骤解决EMC问题
  • RAG系统的现实困境与突破:数据泥潭到知识自由
  • QT的自定义控件
  • 【题解-洛谷】B4302 [蓝桥杯青少年组省赛 2024] 出现奇数次的数
  • 数据库——redis
  • 测试--自动化测试概念
  • java21
  • BISS0001:高性能热释电红外感应IC的详细介绍
  • 学习STC51单片机10(芯片为STC89C52RC)
  • 近场探头阵列技术解析
  • (eNSP)主备接口备份配置
  • BitsAndBytesConfig参数描述
  • redisson-spring-boot-starter 版本选择
  • MySQL备份恢复:数据安全的终极指南
  • 基于Matlab建立不同信道模型
  • 苍穹外卖05 Redis常用命令在Java中操作Redis_Spring Data Redis使用方式店铺营业状态设置
  • 本特利内华达125768-01 RIM i/o模块规范
  • ESP.wdtFeed();的作用与功能,以及使用方法
  • 「AR智慧应急」新时代:当AR眼镜遇上智能监控,打造立体化应急指挥系统
  • AskTable 集成 Databend:结构化数据的 AI 查询新体验
  • 项目自启动文件配置
  • quickbi实现关联度分析(复刻PowerBI展示)
  • 【深度学习:理论篇】--Pytorch之nn.Module详解
  • 嵌入式开发学习日志(linux系统编程--文件读写函数(2))Day25
  • 算法——数组代码
  • RECCV检测人脸伪造项目尝试与扩展