Geri qayıt

Dərs 4: Qraflar

Dərsin videosu

Qeydlər

Bu dərsin qeydləri hələ tam deyil. Əlavə olunana qədər dərsin videosuna baxmağınız tövsiyə olunur. Sonda əlavə resurslar bölməsinə baxmağı da unutmayın.

Sonuncu dərs! Bu dərsdə qraflar haqqında danışacağıq. Qraflar haqqında saysız sayda alqoritm var, amma bu dərsdə elə şeylər öyrənəcəyik ki, əvvəlki respublika olimpiadalarına düşmüş məsələləri həll edə bilək.

Qraflar haqqında ümumi danış. Onları C++-da necə göstəririk (matrix və qonşuluq listi). Ağaclar haqqında danış.

Özünü yoxla
Ağac? məsələsini həll et.

Özünü yoxla
Ağac tap məsələsini həll et.

DFS haqqında daha geniş danış.

Özünü yoxla
Komponentlər məsələsini həll et.

Cycle tapmaq haqqında danış.

int n;
vector<vector<int>> adj;
vector<char> color;
vector<int> parent;
int cycle_start, cycle_end;

bool dfs(int v) {
    color[v] = 1;
    for (int u : adj[v]) {
        if (color[u] == 0) {
            parent[u] = v;
            if (dfs(u)) return true;
        } else if (color[u] == 1) {
            cycle_end = v;
            cycle_start = u;
            return true;
        }
    }
    color[v] = 2;
    return false;
}

void find_cycle() {
    color.assign(n, 0);
    parent.assign(n, -1);
    cycle_start = -1;

    for (int v = 0; v < n; v++) {
        if (color[v] == 0 && dfs(v)) break;
    }

    if (cycle_start == -1) {
        cout << "Cycle yoxdur" << endl;
    } else {
        vector<int> cycle;
        cycle.push_back(cycle_start);
        for (int v = cycle_end; v != cycle_start; v = parent[v])
            cycle.push_back(v);
        cycle.push_back(cycle_start);
        reverse(cycle.begin(), cycle.end());

        cout << "Cycle var: ";
        for (int v : cycle)
            cout << v << " ";
        cout << endl;
    }
}

İkili rəngləmə haqqında danış.

Özünü yoxla
İkili rəngləmə məsələsini həll et.

Özünü yoxla
Çayı keçmək məsələsini həll et.

Topological sort haqqında danış.

int n; // number of vertices
vector<vector<int>> adj; // adjacency list of graph
vector<bool> visited;
vector<int> ans;

void dfs(int v) {
    visited[v] = true;
    for (int u : adj[v]) {
        if (!visited[u])
            dfs(u);
    }
    ans.push_back(v);
}

void topological_sort() {
    visited.assign(n, false);
    ans.clear();
    for (int i = 0; i < n; ++i) {
        if (!visited[i])
            dfs(i);
    }
    reverse(ans.begin(), ans.end());
}

Özünü yoxla
Kurs cədvəli məsələsini həll et.

Xanalar üzərində DFS haqqında danış.

Özünü yoxla
Ən böyük ada məsələsini həll et.

BFS haqqında danış.

Özünü yoxla
Yanğın məsələsini həll et.

Özünü yoxla
Xətlər məsələsini həll et.

Özünü yoxla
Sehr qutusu məsələsini həll et.

Dijkstra alqoritmi haqqında danış.

const int INF = 1000000000;
vector<vector<pair<int, int>>> adj;
using pii = pair<int, int>;

void dijkstra(int s, vector<int> & d, vector<int> & p) {
    int n = adj.size();
    d.assign(n, INF);
    p.assign(n, -1);
    d[s] = 0;
    priority_queue<pii, vector<pii>, greater<pii>> q;
    q.push({0, s});
    while (!q.empty()) {
        int v = q.top().second;
        int d_v = q.top().first;
        q.pop();
        if (d_v != d[v]) continue;
        for (auto edge : adj[v]) {
            int to = edge.first;
            int len = edge.second;
            if (d[v] + len < d[to]) {
                d[to] = d[v] + len;
                p[to] = v;
                q.push({d[to], to});
            }
        }
    }
}

Özünü yoxla
Server məsələsini həll et.

Floyd-Warshall alqoritmi haqqında danış.

for (int k = 0; k < n; ++k) {
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            if (d[i][k] < INF && d[k][j] < INF)
                d[i][j] = min(d[i][j], d[i][k] + d[k][j]); 
        }
    }
}

Özünü yoxla
Qədim Azərbaycan məsələsini həll et.

Əlavə faydalı resurslar

Ev tapşırığı

Ev tapşırıqları üçün eolymp saytında yaratdığım qrup var. Əgər qrupa dəvət almamısınızsa, Piazza-da "E-olymp qrupu üçün" başlıqlı paylaşımın altına istifadəçi adınızı qeyd edin. Dərsdə dediyim kimi, ev tapşırığının məqsədi sizin üçün praktikadır, gələn dərsə qədər bitirməyə ehtiyac yoxdur. Bəzi məsələlərin həllini bilirsinizsə və onlar sizin üçün asandırsa, etməyə də bilərsiniz.