我以以下方式获得输入,其中第一行包含无向图的顶点和边的数量;并且后面的行包含顶点之间的边的名称。
输入:
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);
}
}
答案 0 :(得分:0)
您需要按照jabberwocky的建议天真的实现映射(将字符串映射为整数)。
定义如下的结构以存储字符串。
typedef struct {
unsigned int hashed;
char **map;
} hash;
定义一个函数,该函数将在不存在字符串的情况下将其插入到哈希图中,并返回哈希图中的字符串索引。
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
注意::我尚未为哈希图添加边界检查