Gráfok ábrázolása memóriában

1. Szomszédsági mátrix (matrice de adiacență, adjacency matrix)

Egy n pontú gráf esetén ez egy n x n-es A mátrix, melyben

    A[i][j] = {
        1, ha i és j szomszédosak
        0, ha nem szomszédosak
    } 

Példa:

A mellékelt gráf esetén a szomszédsági mátrix:

    0 1 0 0 1
    1 0 0 0 1 
    0 0 0 0 0
    0 0 0 0 1
    1 1 0 1 0

Tulajdonságok

2. Éllista (listă de muchii)

Adott lesz a csomópontok száma és az élek (számpárok) listája.

Példa:

Az fenti példában szerplő gráfnak 5 csomópontja van, az élei pedig:

    [1,2], [1,5], [2,5], [4,5].

3. Szomszédsági listák (liste de adiacență)

Minden csomópont esetén tároljuk a szomszédjainak a listáját.

Példa:

Az fenti példában szerplő gráf esetén a csomópontok szomszédsági listái:

    1: 2 5
    2: 1 5
    3: (üres)
    4: 5
    5: 1 2 4

Feladat:

Adott n és m, melyek egy gráf csomópontjainak és éleinek számai, majd ezeket követi m darab számpár, melyek egy-egy élet reprezentálnak.

a) Írjuk ki a gráf szomszédsági mátrixát!

b) Írjuk ki a gráfot ábrázoló szomszédsági listákat!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ifstream fin("input.txt");

    int n, m;
    fin >> n >> m;

    int matrix[101][101] = {};

    int lista[101][101];
    int hossz[101] = {};

    for (int i = 1; i <= m; i++) {
        int a, b;
        fin >> a >> b;
        // (a) -- (b)

        // szomsz. mátrix:
        matrix[a][b] = 1;
        matrix[b][a] = 1;

        // szomsz. listák építése

        // a-nak a listájába bemegy b
        lista[a][hossz[a]] = b;
        hossz[a]++;

        // b-nek a listájába bemegy a
        lista[b][hossz[b]] = a;
        hossz[b]++;
    }

    cout << "szomsz. matrix: " << endl;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            cout << matrix[i][j] << " ";
        }
        cout << endl;
    }
    cout << "---------------------" << endl;

    // ha a matrixból állítjuk elő:
    /*
    cout << "szomsz. listak: " << endl;
    for (int i = 1; i <= n; i++) {
        cout << i << ": ";
        for (int j = 1; j <= n; j++) {
            if (matrix[i][j] == 1)
                cout << j << " ";
        }
        cout << endl;
    }
    */

    // ha a közvetlenül felépített listákat használjuk:
    cout << "szomsz. listak: " << endl;
    for (int i = 1; i <= n; i++) {
        cout << i << ": ";
        for (int j = 0; j < hossz[i]; j++) {
            cout << lista[i][j] << " ";
        }
        cout << endl;
    }

    return 0;
}

Feladat:

Adott n, majd egy n x n-es mátrix, mely egy n pontú nemirányított gráf szomsz. mátrixa. Írjuk ki az élek listáját (egy él csak egyszer legyen benne).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ifstream fin("input.txt");

    int n;
    fin >> n;

    int t[101][101];
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            fin >> t[i][j];

    // végigjárjuk a főátló feletti részt
    for (int i = 1; i <= n; i++)
        for (int j = i+1; j <= n; j++)
            if (t[i][j])
                cout << i << " " << j << endl;

    return 0;
}

Feladat:

https://www.pbinfo.ro/probleme/430/izolate

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ifstream fin("izolate.in");
    ofstream fout("izolate.out");

    int n;
    fin >> n;

    int fok[101] = {};

    int a, b;
    while (fin >> a >> b) {
        fok[a]++;
        fok[b]++;
    }

    int db = 0;
    for (int i = 1; i <= n; i++)
        if (fok[i] == 0)
            db++;
    fout << db << " ";

    for (int i = 1; i <= n; i++)
        if (fok[i] == 0)
            fout << i << " ";
    fout << endl;
    return 0;
}