Grafy - Macierz i Lista sąsiedztwa.

0

Witam,

Musze wykonać następujący program:

Napisz program, który odczyta ze standardowego wejścia definicje krawędzi grafu nieskierowanego i na ich podstawie utworzyć macierz i listę sąsiedztwa.

Oba główne zadania wykonałem. Nie mam jednak pomysłu na to jak zmodyfikować kod, aby wpisywać dane krawędzi tylko raz (na początku programu), a później przekazywać to dalej do funkcji i wykonywać dalsze operacje.

Z góry dzięki za pomoc,

 
#include <iostream>

using namespace std;

const int vectors = 100; // maksymalna ilość wierzchołków w grafie
int i,j,check,n,x,y;
void MacierzSasiedztwa(int n);
void ListaSasiedztwa(int n);
void DaneWejsciowe(int &n);

struct lista
{
    int vertex;
    lista *next;
};

int main()
{  
 DaneWejsciowe(n);
 MacierzSasiedztwa(n);
 ListaSasiedztwa(n);
 
  getchar();
  getchar();
  return 0;
}

void DaneWejsciowe(int &n)
{
	 cout << "Podaj ilosc krawedzi: ";
	 cin >> n; // odczytujemy ilość krawędzi
};


void MacierzSasiedztwa(int n)
{
  int Tablica[vectors][vectors]; // macierz sąsiedztwa
  
  for(i = 0; i < vectors; i++)
  for(j = 0; j < vectors; j++) 
	  Tablica[i][j] = 0;
  
  check = 0;

  for(i = 0; i < n; i++)
  {
    cin >> x >> y; // odczytujemy krawędź
    check = (x > check) ? x : check;
    check = (y > check) ? y : check;
    Tablica[x-1][y-1] = 1;
    Tablica[y-1][x-1] = 1;
  }

  cout << endl;
  
  for(i = 0; i < check; i++)
  {
    for(j = 0; j < check; j++) cout << Tablica[i][j] << " ";
    cout << endl;
  }
}

void ListaSasiedztwa(int n)
{
	 struct lista *L[vectors],*p;
  
  for(i = 0; i < vectors; i++) L[i] = NULL;
  check = 0;

  for(i = 0; i < n; i++)
  {
    cin >> x >> y; // odczytujemy krawędź
    check = (x > check) ? x : check;
    check = (y > check) ? y : check;
    p = new lista;
    p->next = L[x-1]; p->vertex = y; L[x-1] = p;
    p = new lista;
    p->next = L[y-1]; p->vertex = x; L[y-1] = p;
  }

  cout << endl;

  for(i = 0; i < check; i++)
  {
    cout << i + 1 << ":";
    p = L[i];
    while(p)
    {
      cout << p->vertex << " ";
      p = p->next;
    }
    cout << endl;
  }
}
0

Stwórz strukturę która przechowa Ci dany graf w jednej z postaci a następnie konwertuj do drugiej.

0

Mógłbyś bardziej rozjaśnić? np. na jakimś przykładzie?

0

Np. z macierzy w listę sąsiedztwa -> dla każdego i -tego wiersza macierzy sprawdzasz, jeśli w j-tej kolumnie jest 1-ka to wrzucasz na i-tą listę indeks j kolumny (numer sąsiadującego wierzchołka).

1 użytkowników online, w tym zalogowanych: 0, gości: 1