假设我有一个图表,上面写着
6 7
1 2 -2
2 3 -1
3 1 -4
3 4 -2
3 5 -3
6 4 -1
6 5 -4
其中第一行分别表示节点数和边数,其余部分读取边和权重。我知道如何从这张图中读取输入。
我的问题是,如果不在第一行指定节点数(或任何内容),我将如何读取此图的边缘和权重。例如,我将如何在此图表中读取以执行相同的操作...
1 4 -4
2 3 3
1 2 -2
3 4 -2
2 1 1
谢谢!
Here is my current code
FILE *fin = fopen(argv[1], "r");
fscanf(fin, "%d", &n);
e = 0;
for (i = 0; i < n; ++i)
for (j = 0; j < n; ++j) {
fscanf(fin, "%d", &w);
if (w != 0) {
edges[e].u = i;
edges[e].v = j;
edges[e].w = w;
++e;
}
}
您将创建一个链表,该链表会随着添加的每个节点而动态增长 - 并一直持续到文件末尾。很多打电话给malloc
就可以了。除非你展示你现在是如何读取数据的,以及你的数据结构是什么,否则很难给你一个更详细的答案。
有点取决于图形实现以及是否可以动态插入节点。 对于每一行,读取两个节点,如果图形中当前不存在一个或两个节点,则需要插入它们,然后插入边缘。 如果您使用的是矩阵表示形式,则需要不断调整矩阵的大小并复制矩阵(坏)。 如果您使用的是列表或队列表示形式,则需要遍历每个节点以查看它是否已为每个新行插入(不好,但不太糟糕)。 对于有序列表,这稍微好一些,因为只要您到达具有较大数字的节点,您就可以停止并插入。 此实现也不要求连续命名节点(即节点名称为 1、2、5、19、20202、20203,... 的图形)