我试图用约束来解决任务:\ $ 1 \ le B,L,S \ le 100 000 \ $。为此,我在图表底部的每个边缘使用BFS,然后运行BFS直到达到JLabel rectanglelLabel = new JLabel(rectangleIcon);
states.add(rectanglelLabel);
rectanglelLabel.setText("State " + counter);
rectanglelLabel.setHorizontalTextPosition(JLabel.CENTER);
rectanglelLabel.setBounds((counter*100)%500,((counter/3)*100)%500,50,50);
counter++;
jPanel2.add(rectanglelLabel);
jPanel2.revalidate();
jPanel2.repaint();
。但是,在编译器中运行代码时,会出现超时错误。为什么我会收到TLE错误,我在此代码中要更改哪些内容?
y=0
答案 0 :(得分:1)
您的方法存在两个问题,导致O(B *(B * L + S))的复杂性。
第一个问题是,如果整个第一行充满了石头,那么在最坏的情况下运行bfs B次。你有S石头,每块石头最多有4个邻居,因此每次调用bfs都会在O(S)中运行,但你做B次,因此你的算法需要一些关于O(B * S)操作的情况 - 我确定该问题的作者注意到具有此运行时间的程序将超时(在所有至少10 ^ 10次操作之后)。
此问题的一种可能解决方案是使用队列中已存在的第一行的所有宝石启动bfs。通过向图表添加新顶点并将其连接到第一行中的宝石,也可以获得多个起点。第二种方法对于您的实现来说并不容易,因为您使用的是数据结构。
这个(数据结构)是你的第二个问题:你有S = 10 ^ 5个元素/顶点/石头但是使用B * L = 10 ^ 10个内存单元。它是2G内存!我不知道这个问题的内存限制是什么 - 它只是为了!初始化B次需要花费B * B * L总体操作。
更好的方法是使用稀疏数据结构,如adjacency list。但要注意在O(S ^ 2)中填写此数据结构 - 使用O(SlogS)或甚至unordered_set的集合来执行O(S)运行时间。