1

对于编程作业,我正在实现 Prim 算法,测试用例的输入文件格式如下:

输入的第一行将是一个整数 C,表示测试用例的数量。每个测试用例的第一行包含两个整数 N 和 E,其中 N 表示图中的节点数,E 表示边数。然后是 E 行,每行有 3 个整数 I、J 和 P,其中 I 和 J 表示边的节点(无向图,其中 0 ≤ I, J

尽管即使我正在启动代码(我是编程新手),但我不明白为什么我的代码只读取测试用例的条目,我做错了什么?

这是读取文件 entradaA.in 的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc, char *argv []){

int testCases;
int numberNodes;
int numberEdges;

freopen("entradaA.in", "r", stdin);
int i, j, cont=1;
int total = 0;
int a, b, c;

scanf ("%d", &testCases);



    for (i=0; i<testCases; ++i)
    {

    scanf ("%d %d", &numberNodes, &numberEdges); //Number Nodes & Edges

        for (i=0; i<numberEdges; i++)
        {
        scanf ("%d %d %d", &a,&b,&c);//
        printf ("%d %d %d\n", a, b, c);
        }

    printf ("Caso %d: Total Weight %d\n", cont++, total);
    }

return (0);

}

输入文件 (entradaA.in) 看起来像这样

2
7 11
0 1 17
0 2 10
0 6 14
1 2 6
1 3 1
2 3 4
2 6 3
3 4 7
4 6 10
4 5 2
5 6 9
6 9
0 1 30
0 2 30
1 3 22
1 5 33
2 3 20
2 4 33
3 4 15
3 5 20
5 4 20
4

2 回答 2

1

您在循环内修改了循环变量i,这通常是不需要的。在这种情况下,由于i循环到 11(边数),它导致您的程序终止,因为 11 不小于 2(输入中的测试用例数)。

您可以使用临时变量(如果您使用的是 C++,谢谢 aardvarkk):

for (int i=0; i<testCases; ++i)
    {
        scanf ("%d %d", &numberNodes, &numberEdges); //Number Nodes & Edges
        for (int j=0; j<numberEdges; j++)

请注意,int j也可能是int i,但我不推荐它。只需使用另一个名称的变量会更清楚。或者,如果您在 C 中,只需删除这两个int并使用函数本地的变量。

有关更多信息,您可以阅读内容。

于 2011-07-11T04:10:34.240 回答
0

您的代码在我的机器上产生了以下输出。我所做的唯一更改是在调用使代码标准 C之前声明inti等。jfreopen

0 1 17
0 2 10
0 6 14
1 2 6
1 3 1
2 3 4
2 6 3
3 4 7
4 6 10
4 5 2
5 6 9
Caso 1: Total Weight 0

它肯定比你的测试用例阅读更多,所以我不确定问题是什么?

于 2011-07-11T04:11:01.097 回答