gpt4 book ai didi

c - 实现 Ford-Fulkerson 的函数中出现段错误

转载 作者:行者123 更新时间:2023-11-30 17:01:00 25 4
gpt4 key购买 nike

我正在做一项类作业,但遇到了一个我无法解决的问题。我正在使用 BFS 实现 Ford-Fulkerson 算法来查找最大流量。但是,在尝试将剩余容量矩阵设置为给定容量时,我遇到了段错误。在我们收到的测试代码中,我可以看到原始容量矩阵是通过其地址按值传递的,但我有一种感觉,在我的代码中我没有按照我认为的方式与它交互?这让我相信我可能在其他地方也遇到同样的问题。我使用 gdb 发现我在嵌套 for 循环中的这一行遇到了段错误:

    resCap[i][j] = *(capacity + i*n + j);

但是,我尝试过的任何方法都对我不起作用,所以我很困惑。

void maximum_flow(int n, int s, int t, int *capacity, int *flow)
{
int i, j, resCap[n][n], path[n]; // residual capacity and BFS augmenting path
int min_path = INT_MAX; // min of the augmenting path

// Assign residual capacity equal to the given capacity
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
{
resCap[i][j] = *(capacity + i*n + j);
*(flow + i*n + j) = 0; // no initial flow
}

// Augment path with BFS from source to sink
while (bfs(n, s, t, &(resCap[0][0]), path))
{
// find min of the augmenting path
for (j = t; j != s; j = path[j])
{
i = path[j];
min_path = min(min_path, resCap[i][j]);
}

// update residual capacities and flows on both directions
for (j = t; j != s; j = path[j])
{
i = path[j];
if(*(capacity + i*n + j) > 0)
*(flow + i*n + j) += min_flow_path;
else
*(flow + j*n + i) -= min_flow_path;

resCap[i][j] -= min_flow_path;
resCap[j][i] += min_flow_path;
}
}
}

这是向我们提供的测试代码,以备需要时使用:

int main(void)
{ int cap[1000][1000], flow[1000][1000];
int i,j, flowsum;
for(i=0; i< 1000; i++)
for( j =0; j< 1000; j++ )
cap[i][j] = 0;

for(i=0; i<499; i++)
for( j=i+1; j<500; j++)
cap[i][j] = 2;
for(i=1; i<500; i++)
cap[i][500 + (i/2)] =4;
for(i=500; i < 750; i++ )
{ cap[i][i-250]=3;
cap[i][750] = 1;
cap[i][751] = 1;
cap[i][752] = 5;
}
cap[751][753] = 5;
cap[752][753] = 5;
cap[753][750] = 20;
for( i=754; i< 999; i++)
{ cap[753][i]=1;
cap[i][500]=3;
cap[i][498]=5;
cap[i][1] = 100;
}
cap[900][999] = 1;
cap[910][999] = 1;
cap[920][999] = 1;
cap[930][999] = 1;
cap[940][999] = 1;
cap[950][999] = 1;
cap[960][999] = 1;
cap[970][999] = 1;
cap[980][999] = 1;
cap[990][999] = 1;
printf("prepared capacity matrix, now executing maxflow code\n");
maximum_flow(1000,0,999,&(cap[0][0]),&(flow[0][0]));
for(i=0; i<=999; i++)
for(j=0; j<=999; j++)
{ if( flow[i][j] > cap[i][j] )
{ printf("Capacity violated\n"); exit(0);}
}
flowsum = 0;
for(i=0; i<=999; i++)
flowsum += flow[0][i];
printf("Outflow of 0 is %d, should be 10\n", flowsum);
flowsum = 0;
for(i=0; i<=999; i++)
flowsum += flow[i][999];
printf("Inflow of 999 is %d, should be 10\n", flowsum);

printf("End Test\n");
}

最佳答案

这条线可能会出现段错误,它确实使用了 Clang。

int i, j, resCap[n][n], path[n]; 

您在堆栈上声明了一个非常大的数组。当您尝试使用 calloc 分配它时,可以看到它有多大。请尝试此操作,并且不要忘记使用相同类型的循环来释放它。

int **resCap2 = calloc(1, n * sizeof(int *));
assert(resCap2);
for (i = 0; i < n; i++) {
resCap2[i] = calloc(1, n * sizeof(int));
assert(resCap2[i]);
}

这是一个很大的空间,即

(1000 * sizeof(int*) * (1000 * n * sizeof(int)))

关于c - 实现 Ford-Fulkerson 的函数中出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37259283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com