Cod sursa(job #3361667)

Utilizator ana_batAna Batatorescu ana_bat Data 27 iulie 2026 16:27:03
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.93 kb
#include<queue>
#include<fstream>
#include<vector>
#include<tuple>
using namespace std;

// vector<tuple<int,int,int>> edges;
// int n, m;
//
// const int inf = 1e9;
//
// void citire00() {
//     ifstream fin("bellmanford.in");
//
//     fin >> n >> m;
//     edges.resize(m);
//
//     int p1, p2, c;
//
//     for (int i = 0; i < m; i++) {
//         fin >> p1 >> p2 >> c;
//         edges[i] = make_tuple(p1, p2, c);
//     }
// }

/// algoritmul original, dar neoptimizat. pe infoarena da 35p
// void bellmanford() {
//     vector<int> dist(n + 1, inf);
//
//     dist[1] = 0;
//
//     for (int i = 1; i <= n - 1; i++) {
//         for (auto e : edges) {
//             int p1, p2, c;
//             tie(p1, p2, c) = e;
//
//             if (dist[p1] != inf && dist[p1] + c < dist[p2]) {
//                 dist[p2] = dist[p1] + c;
//             }
//         }
//     }
//
//     bool neg = false;
//
//     for (auto e : edges) {
//         int p1, p2, c;
//         tie(p1, p2, c) = e;
//
//         if (dist[p1] != inf && dist[p1] + c < dist[p2]) {
//             neg = true;
//             break;
//         }
//     }
//
//     ofstream fout("bellmanford.out");
//
//     if (neg) {
//         fout << "Ciclu negativ!";
//     }
//     else {
//         for (int i = 2; i <= n; i++) {
//             fout << dist[i] << " ";
//         }
//     }
// }



///alg SPFA ( Shortest Path Faster Algorithm)
vector<vector<pair<int,int>>> adj;
int n, m;

const int inf = 1e9;

void citire() {
    ifstream fin("bellmanford.in");

    fin >> n >> m;

    adj.resize(n + 1);

    int p1, p2, c;

    for (int i = 0; i < m; i++) {
        fin >> p1 >> p2 >> c;
        adj[p1].push_back({p2, c});
    }
}

void bellmanford() {
    vector<int> dist(n + 1, inf);
    vector<bool> inq(n + 1, false);
    vector<int> cnt(n + 1, 0);

    queue<int> q;

    dist[1] = 0;
    q.push(1);
    inq[1] = true;

    bool neg = false;

    while (!q.empty()) {
        int nod = q.front();
        q.pop();

        inq[nod] = false;

        for (auto u : adj[nod]) {
            int vecin = u.first;
            int cost = u.second;

            if (dist[nod] + cost < dist[vecin]) {
                dist[vecin] = dist[nod] + cost;

                if (!inq[vecin]) {
                    q.push(vecin);
                    inq[vecin] = true;

                    cnt[vecin]++;

                    if (cnt[vecin] >= n) {
                        neg = true;
                        break;
                    }
                }
            }
        }

        if (neg)
            break;
    }

    ofstream fout("bellmanford.out");

    if (neg) {
        fout << "Ciclu negativ!";
    }
    else {
        for (int i = 2; i <= n; i++) {
            fout << dist[i] << " ";
        }
    }
}

int main() {
    citire();
    bellmanford();

    return 0;
}