int main()
{
int i,j,k,l,m;
int maxflow=0;
int first,second,capac;
int residual[100][100];
//reading from file
FILE*fp;
fp=fopen("ford.txt","r");
fscanf(fp,"%d %d",&node,&edge);
cout<<"nodes are"<<node<<"\n"<<"edges are"<<edge<<"\n";
for(j=1;j<=node;j++)
{
for(k=1;k<=node;k++)
{
capacity[j][k]=0;
}
}
for(i=0;i<edge;i++)
{
fscanf(fp,"%d %d %d",&first,&second,&capac);
cout<<first<<"->"<<second<<"="<<capac<<"\n"; //it is printing this
capacity[first][second]=capac;//crashes here at last i/p i.e.1=edge-1
}
cout<<"abc"; //this is not printed
for(l=1;l<=node;l++)
{
for(m=1;m<=node;m++)
{
flow[l][m]=capacity[l][m];
flow[m][l]=0;
}
}
return 0;
}
它甚至没有在cout语句中打印“abc”。我正在尝试实施Ford-Fulkerson算法。在这里,我正在读取文件并初始化容量流矩阵。之后我调用maxflow函数,我在这里省略了。
答案 0 :(得分:1)
就目前而言,你的代码比C ++更多。虽然(正如@jrok评论的那样)缩进和间距之类的东西可以使用一些改进,但我认为一个相当大的变化会更有帮助。你不需要将一堆不相关的“东西”打包到main
中,而是真的需要/想要将事物分解成函数(可能还有类来代表程序中的逻辑“部分”。
至少从外观上看,您可能希望从具有(至少)I / O功能的matrix
类开始。这可能应该使用std::vector
来存储数据,因此它可以从文件中读取大小,然后分配适当的空间来保存数据。
class matrix {
std::vector<int> data;
size_t rows;
size_t columns;
public:
std::istream &read(std::istream &infile);
std::ostream &write(std::ostream &outfile);
};
如果对矩阵有一个不错的定义,那么你现在拥有的大部分代码似乎都会出现:
std::ifstream in("ford.txt");
matrix capacity;
capacity.read(in); // or `in >> capacity;`
matrix flow = capacity;
答案 1 :(得分:1)
您没有检查以确保您的阵列访问位于数组的范围内。这是一些代码。我假设流量定义与容量和残差相同,因为您没有为它提供定义。
此外,我已经将循环索引更改为从0开始,因为C和C ++中的数组是从0开始索引而不是1.如果您打算保持数组的第一行和第一列不变,那么您可以更改那些人将<
更改为<=
s。
另外,我使用std :: endl来刷新输出缓冲区。如果程序在执行该语句后很快崩溃,则输出缓冲可能导致cout&lt;&lt;“abc”执行但不输出任何内容。
#define WIDTH 100
#define HEIGHT 100
int capacity[WIDTH][HEIGHT];
int flow[WIDTH][HEIGHT];
int node, edge;
int main() {
int maxflow=0;
int first,second,capac;
int residual[WIDTH][HEIGHT];
//reading from file
FILE*fp;
fp=fopen("ford.txt","r");
fscanf(fp,"%d %d",&node,&edge);
cout<<"nodes are"<<node<<"\n"<<"edges are"<<edge<<"\n";
//check if node is out of bounds...
if(node >= WIDTH || node >= HEIGHT) {
//if it is, warn
cout<<"Warning: node is at least "
<<WIDTH<<" or "<<HEIGHT<<"."
<<std::endl;
}
//prevent accessing out-of-bounds locations by comparing
// xIdx and yIdx against WIDTH and HEIGHT, respectively
for(int xIdx=0; xIdx < node && xIdx < WIDTH; xIdx++) {
for(int yIdx=0; yIdx < node && yIdx < HEIGHT; yIdx++) {
capacity[xIdx][yIdx]=0;
}
}
for(i=0;i<edge;i++) {
fscanf(fp,"%d %d %d",&first,&second,&capac);
cout<<first<<"->"<<second<<"="<<capac<<"\n";
if(first < WIDTH && second < HEIGHT) {
capacity[first][second]=capac;
}
//Stop execution if one of first or second is out of bounds
else {
cout<<"ERROR: ["<<first<<"]["<<second<<"]"
<<" not within ["<<WIDTH<<"]["<<HEIGHT<<"]"
<<std::endl;
return -1;
}
}
cout<<"abc"<<std::endl;
for(int xIdx=0; xIdx < node && xIdx < WIDTH; xIdx++) {
for(int yIdx=0; yIdx < node && yIdx < HEIGHT; yIdx++) {
flow[xIdx][yIdx]=capacity[xIdx][yIdx];
flow[yIdx][xIdx]=0;
}
}
return 0;
}