Как мне составить список смежности или (матрицу смежности) из массивов в моем коде для взвешенного графа - PullRequest
0 голосов
/ 13 апреля 2020

Эй, я хочу создать матрицу смежности для следующего взвешенного графика . Я не уверен, как я должен go делать это. Я знаю, что мне нужны узлы, которые представляют собой города (21) и ребра, которые представляют собой общее количество поездок (43). Может ли кто-нибудь помочь мне внедрить их в мой код? Мой код и файл, который я в нем использовал, следующие:

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

typedef struct {
 int num;
 char start_vertex[250];
 char destination_vertex[250];
} value;

/*
    this function takes an array of values, a size, and a string to search for
    it checks both vertex in every value for the string and returns true it if finds it
    it returns false if it doesn't find it
*/
int search(value *valuesPtr, int size, const char *string)
{
    for(int i=0; i<size; i++)
    {
        /* if the string matches the start_vertex then we found it */
        if(!strcmp(valuesPtr[i].start_vertex,string)) return true;

        /* if the string matches the destination_vertex then we found it */
        if(!strcmp(valuesPtr[i].destination_vertex,string)) return true;
    }

    /* we didn't find it */
    return false;
}

int main()
{
    /* open the file */
    FILE *fptr = fopen("energy.txt","r");
    if (!fptr) { printf("Couldn't open 'energy.txt'\n"); return EXIT_FAILURE; }

    /* count the records */
    int nLines = 0;
    char string[1000];
    while (fgets(string, 1000, fptr)) nLines++;

    /* go back the to beginning of the file */
    rewind(fptr);

    /* allocate the memory */
    value *valuesPtr = malloc(sizeof(value) * nLines);
    if (!valuesPtr) { printf("Couldn't allocate memory for %d values\n", nLines); return EXIT_FAILURE; }

    /* read the data from the file */
    puts("\nRecords:");
    for (int i = 0; i < nLines; i++ )
    {
        /* keep in mind this only works for cities with no spaces in the names - New York will not work */
        if (fscanf(fptr, "%249s %249s %d",
            valuesPtr[i].start_vertex,
            valuesPtr[i].destination_vertex,
            &valuesPtr[i].num) < 3)
        {
            printf("Couldn't read values from line %d\n", i);
            return EXIT_FAILURE;
        }

        printf("Start: %s, Destination: %s, Weight: %d\n",
            valuesPtr[i].start_vertex, valuesPtr[i].destination_vertex, valuesPtr[i].num);
    }

    /* now print the list of cities */
    puts("\nCities:");
    /* this is not a very efficient way to do it - but it is easy to understand */
    for (int i = 0; i < nLines; i++ )
    {
        /* if we can't find start_vertex then print it */
        if(!search(valuesPtr,i,valuesPtr[i].start_vertex))
            puts(valuesPtr[i].start_vertex);

        /* if we can't find destination_vertex then print it */
        if(!search(valuesPtr,i,valuesPtr[i].destination_vertex))
            puts(valuesPtr[i].destination_vertex);
    }

    return EXIT_SUCCESS;
}

Файл

York    Hull    60
Leeds   Doncaster   -47
Liverpool   Nottingham  161
Manchester  Sheffield   61
Reading Oxford  -43
Oxford  Birmingham  103
Birmingham  Leicester   63
Liverpool   Blackpool   79
Carlisle    Newcastle   92
Nottingham  Birmingham  77
Leeds   York    39
Glasgow Edinburgh   74
Moffat  Carlisle    65
Doncaster   Hull    76
Northampton Birmingham  90
Leicester   Lincoln 82
Sheffield   Birmingham  122
Lincoln Doncaster   63
Sheffield   Doncaster   29
Bristol Reading 130
Hull    Nottingham  145
Blackpool   Leeds   116
Birmingham  Bristol 139
Manchester  Leeds   64
Carlisle    Blackpool   140
Leicester   Northampton -61
Newcastle   York    135
Glasgow Moffat  -28
Leicester   Sheffield   100
Carlisle    Liverpool   -30
Birmingham  Manchester  129
Oxford  Bristol 116
Leeds   Hull    89
Edinburgh   Carlisle    154
Nottingham  Sheffield   61
Liverpool   Manchester  56
Carlisle    Glasgow 50
Sheffield   Lincoln 74
York    Doncaster   55
Newcastle   Edinburgh   177
Leeds   Sheffield   53
Northampton Oxford  68
Manchester  Carlisle    20

Кстати, всего 21 ребро (города) и 43 вершины (однонаправленные пути из одного города в другой)

...