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

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

相关文章

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2431 poj 3253 优先队列的运用

poj 2431: 题意: 一条路起点为0, 终点为l。 卡车初始时在0点,并且有p升油,假设油箱无限大。 给n个加油站,每个加油站距离终点 l 距离为 x[i],可以加的油量为fuel[i]。 问最少加几次油可以到达终点,若不能到达,输出-1。 解析: 《挑战程序设计竞赛》: “在卡车开往终点的途中,只有在加油站才可以加油。但是,如果认为“在到达加油站i时,就获得了一

poj 2914 无向图的最小割

题意: 求无向图的最小割。 解析: 点击打开链接 代码: #pragma comment(linker, "/STACK:1677721600")#include <map>#include <set>#include <cmath>#include <queue>#include <stack>#include <vector>#include <cstd

POJ2010 贪心优先队列

c头牛,需要选n头(奇数);学校总共有f的资金, 每头牛分数score和学费cost,问合法招生方案中,中间分数(即排名第(n+1)/2)最高的是多少。 n头牛按照先score后cost从小到大排序; 枚举中间score的牛,  预处理左边与右边的最小花费和。 预处理直接优先队列贪心 public class Main {public static voi

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

JVM内存调优原则及几种JVM内存调优方法

JVM内存调优原则及几种JVM内存调优方法 1、堆大小设置。 2、回收器选择。   1、在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。   2、对JVM内存的系统级的调优主要的目的是减少

JVM 常见异常及内存诊断

栈内存溢出 栈内存大小设置:-Xss size 默认除了window以外的所有操作系统默认情况大小为 1MB,window 的默认大小依赖于虚拟机内存。 栈帧过多导致栈内存溢出 下述示例代码,由于递归深度没有限制且没有设置出口,每次方法的调用都会产生一个栈帧导致了创建的栈帧过多,而导致内存溢出(StackOverflowError)。 示例代码: 运行结果: 栈帧过大导致栈内存

理解java虚拟机内存收集

学习《深入理解Java虚拟机》时个人的理解笔记 1、为什么要去了解垃圾收集和内存回收技术? 当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些“自动化”的技术实施必要的监控和调节。 2、“哲学三问”内存收集 what?when?how? 那些内存需要回收?什么时候回收?如何回收? 这是一个整体的问题,确定了什么状态的内存可以