我正在解决问题老鼠和迷宫上的问题http://www.spoj.com/problems/MICEMAZE/ 我使用简单的递归方法,因为约束非常小。
我的代码在ideone上运行时没有任何错误,但它在spoj(分段错误)上给出了运行时错误。 我无法弄清楚代码中的问题。
这是我的C ++程序,我使用邻接列表来表示图形。
#include<iostream>
#include<vector>
#include<climits>
using namespace std;
vector<pair<int,int> > graph[100]; //adjacency list , pair stores the destination node of an edge and its weight
int e,t,n,count=0,cost,visited[105];
void maze(int v,int c) //recurssive routine which checks the cost of travelling to each node until it finds the exit node.
{
if(c>t)
return;
if(v==e)
{
if(c<=cost)
cost=c;
return;
}
for(int i=0;i<graph[v].size();i++)
{
if(!visited[graph[v][i].first])
{
visited[graph[v][i].first]=1;
maze(graph[v][i].first,graph[v][i].second+c);
visited[graph[v][i].first]=0;
}
}
}
int main()
{
int a,b,w,m;
cin>>n;
cin>>e;
cin>>t;
cin>>m;
for(int i=0;i<m;i++)
{
cin>>a;
cin>>b;
cin>>w;
graph[a].push_back(make_pair(b,w));
}
for(int i=1;i<=n;i++)
{
cost=INT_MAX;
if(!visited[i])
{
visited[i]=1;
maze(i,0);
visited[i]=0;
}
if(cost<=t)
count++;
}
cout<<count;
return 0;
}
答案 0 :(得分:0)
你的第二个循环中你将从1变为n。如果n为105,则程序将出现分段错误。
你需要从0到104(i = 0; i&lt; n)。
答案 1 :(得分:0)
maze(i,0);
i
与1
n
不等,n
如果100
等于graph
你会去访问graph[v]
时超出O(n!)
界限。
但即使你修复了这个问题,你也会得到一个时间限制错误,因为虽然约束条件很小,但你可以有效地检查图中给定长度的所有可能路径,这大约是{{1}}复杂度。 / p>
答案 2 :(得分:0)
很难说出为什么在一个系统上它起作用而在另一个系统上却没有更多的信息。我的猜测是:内存超出了。请注意,像SPOJ这样的练习页面通常会给出内存限制。他们写道N&lt; = 100,所以你可以修复你的阵列,因为100不是很大,但是他们并没有给你M限制!我敢打赌,他们准备了大量数字的棘手输入。在这种情况下,由于重新分配(谷歌更多或在这里查看Does std::vector *have* to move objects when growing capacity? Or, can allocators "reallocate"?),因此向量的内存管理是杀手。