Эй, я хочу создать матрицу смежности для следующего взвешенного графика . Я не уверен, как я должен 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 вершины (однонаправленные пути из одного города в другой)