gpt4 book ai didi

将图的顶点名称转换为 C 中的索引

转载 作者:行者123 更新时间:2023-11-30 16:27:46 25 4
gpt4 key购买 nike

我通过以下方式获得输入,其中第一行包含无向图的顶点和边的数量;接下来的行包含其间有一条边的顶点的名称。

输入:

9 8
sainteanne fortdefrance
bassepointe latrinite
bridgetown jackmans
fortdefrance ducos
holetown bridgetown
shanty bridgetown
fortdefrance bassepointe
jackmans shanty

这意味着该图有 9 个顶点和 8 条边。上述每一对中的元素之间都存在边。最终目标是找到该图中的连接组件。

但是,使用顶点作为索引号比使用字符串更容易。因此,我正在寻找一种方法将上述信息转换为以下内容:

0 1
2 3
4 5
1 6
7 4
8 4
1 2
5 8

我编写了以下 C 代码来读取文件并创建一个包含必须存储顶点 ID 的边的结构。

typedef struct {
unsigned int first;
unsigned int second;
} edge;

int main()
{
unsigned int order; // no.of Vertices
unsigned int n; // no.of Edges
edge *edges;

scanf("%u %u",&order,&n);
edges = malloc(n * sizeof(edge));
char first_string[20];
char second_string[20];

for (int i=0;i<n;i++)
{
scanf("%s %s",first_string,second_string);

}
}

最佳答案

您需要按照 jabberwocky 的建议简单地实现映射(将字符串映射到整数) .

  • 定义如下结构来存储字符串。

        typedef struct {
    unsigned int hashed;
    char **map;
    } hash;
  • 定义一个函数,如果字符串不存在,则将其插入到 hashmap 中,并返回字符串在 hashmap 中的索引。

    int insertInMap(hash *map, char *entry)

  • 将返回的索引存储到edge结构中。

    edges[i].first =insertInMap(&map,first_string);
    Edges[i].second =insertInMap(&map,second_string)

完整代码:

typedef struct {
unsigned int first;
unsigned int second;
} edge;


typedef struct {
unsigned int hashed;
char **map;
} hash;


int insertInMap(hash *map, char *entry)
{
int i =0;
for (i=0;i<map->hashed;i++)
{
if (strcmp(map->map[i],entry) == 0)
return i;
}
/* Warning no boundary check is added */
map->map[map->hashed++] = strdup(entry);
return map->hashed-1;
}

int main()
{
unsigned int order; // no.of Vertices
unsigned int n; // no.of Edges
edge *edges;
hash map;
scanf("%u %u",&order,&n);
edges = malloc(n * sizeof(edge));

map.map = malloc(n * sizeof(char*));
map.hashed = 0;

char first_string[20];
char second_string[20];

for (int i=0;i<n;i++)
{
scanf("%s %s",first_string,second_string);
edges[i].first =insertInMap(&map,first_string);
edges[i].second =insertInMap(&map,second_string);

}

for (int i =0;i<n;i++)
printf("%d->%d\n", edges[i].first, edges[i].second);

/* Do your work*/

for (int i=0;i<n;i++)
free(map.map[i]);
free(map.map);
free(edges);
}

输出:

0->1
2->3
4->5
1->6
7->4
8->4
1->2
5->8

Note:: I have not added boundary checking for hashmap

关于将图的顶点名称转换为 C 中的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52630512/

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