吝啬的国度--无向图,广度优先遍历,内存爆掉了

2024-04-23 14:32

本文主要是介绍吝啬的国度--无向图,广度优先遍历,内存爆掉了,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=20

吝啬的国度

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
描述
在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来。现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路)。
输入
第一行输入一个整数M表示测试数据共有M(1<=M<=5)组
每组测试数据的第一行输入一个正整数N(1<=N<=100000)和一个正整数S(1<=S<=100000),N表示城市的总个数,S表示参观者所在城市的编号
随后的N-1行,每行有两个正整数a,b(1<=a,b<=N),表示第a号城市和第b号城市之间有一条路连通。
输出
每组测试数据输N个正整数,其中,第i个数表示从S走到i号城市,必须要经过的上一个城市的编号。(其中i=S时,请输出-1)
样例输入
1
10 1
1 9
1 8
8 10
10 3
8 6
1 2
10 4
9 5
3 7
样例输出
-1 1 10 10 9 8 3 1 1 8

思路:不多说,~_~表示不知道题目说什么,不过当复习下知识点:向图,广度优先遍历吧。


附上自己的代码:居然超过了内存限制。。。苦逼~~~~,有时间再研究下,怎么优化

import java.util.ArrayList;
import java.util.Scanner;public class Main{public static void main(String[] args){Main main =new Main();main.solution();}public void solution(){Scanner cin=new Scanner(System.in);int n=cin.nextInt();while(n-->0){int allCity=cin.nextInt();int startCity=cin.nextInt();int [][] path=new int[allCity][allCity];for(int i=0;i<allCity-1;i++){	//是allCity-1条路,n座城市有n-1条路 --初始化数组,无向图int xi=cin.nextInt()-1;int xj=cin.nextInt()-1;path[xi][xj]=1;path[xj][xi]=1;}/*for(int[] a:path){for(int b:a)System.out.print(b);System.out.println();}*/ArrayList<Integer> queue=new ArrayList<Integer>();queue.add(startCity-1);while(queue.size()>0){	int tmp=queue.remove(0);for(int i=0;i<allCity;i++){	//进行广度优先遍历,由无向变成有向,即:将无根树变成有根树if(path[tmp][i]!=0){path[i][tmp]=0;queue.add(i);}}}for(int i=0;i<allCity;i++){		//寻找路径if(i==startCity-1)System.out.print("-1 ");else{for(int j=0;j<allCity;j++){if(path[j][i]!=0){System.out.print(j+1+" ");break;}}}}System.out.println();}}
}

最后附上java能ac的代码: http://blog.csdn.net/taotaotaotao910429/article/details/7850829 可以参考下。。不明白,模拟一遍就差不多了,感觉最直接的方法就是模拟一下,就知道整体式怎么一回事了

7.29号,今天对着能ac的代码又做了一遍,发现思路跟昨天是一样的,关键是怎么优化,将二维数组变为一维数组。用上强大的集合。。不过也是勉强的通过。

代码如下:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class result
{ArrayList<Integer>vector=new ArrayList<Integer>();
}
public class Main {static result results[];static int path[],start,citynumber;static boolean mark[];public static void bfs(){Queue<Integer>queue=new LinkedList<Integer>();queue.add(start);mark[start]=true;while(!queue.isEmpty()){int s=queue.remove();for(int i=0;i<results[s].vector.size();i++){if(!mark[results[s].vector.get(i)]){path[results[s].vector.get(i)]=s;mark[results[s].vector.get(i)]=true;queue.add(results[s].vector.get(i));}}}}public static void main(String[] args) {Scanner scanner=new Scanner(System.in);int cases=scanner.nextInt();while(cases--!=0){citynumber=scanner.nextInt();start=scanner.nextInt();results=new result[citynumber+1];path=new int[citynumber+1];mark=new boolean[citynumber+1];Arrays.fill(path, -1);	//全部初始化为-1for(int i=0;i<=citynumber;i++){results[i]=new result();}for(int i=0;i<citynumber-1;i++){int x,y;x=scanner.nextInt();y=scanner.nextInt();results[x].vector.add(y);results[y].vector.add(x);}bfs();for(int i=1;i<=citynumber;i++){System.out.print(path[i]+" ");}}}
}



这篇关于吝啬的国度--无向图,广度优先遍历,内存爆掉了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/929060

相关文章

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三

Java内存区域与内存溢出异常的详细探讨

《Java内存区域与内存溢出异常的详细探讨》:本文主要介绍Java内存区域与内存溢出异常的相关资料,分析异常原因并提供解决策略,如参数调整、代码优化等,帮助开发者排查内存问题,需要的朋友可以参考下... 目录一、引言二、Java 运行时数据区域(一)程序计数器(二)Java 虚拟机栈(三)本地方法栈(四)J

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据

Java遍历HashMap的6种常见方式

《Java遍历HashMap的6种常见方式》这篇文章主要给大家介绍了关于Java遍历HashMap的6种常见方式,方法包括使用keySet()、entrySet()、forEach()、迭代器以及分别... 目录1,使用 keySet() 遍历键,再通过键获取值2,使用 entrySet() 遍历键值对3,

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR