Cod sursa(job #1737077)

Utilizator flaviu_2001Craciun Ioan-Flaviu flaviu_2001 Data 3 august 2016 12:27:02
Problema Algoritmul Bellman-Ford Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <vector>
#define MAX 50005
#define INF 1 << 30

using namespace std;

struct data{
    int edge, weight;
} nd;

vector<data> v[MAX];

int nodes, edges, d[MAX];
bool negCycle(0);

void read();
void bell();
void write();

int main(){
    read();
    bell();
    write();
    return 0;
}

void read(){
    ifstream fin ("bellmanford.in");
    fin >> nodes >> edges;
    int x, y ,z;
    for (int i = 1; i <= edges; ++i){
        fin >> x >> y >> z;
        nd.edge = y, nd.weight = z;
        v[x].push_back(nd);
    }
    for (int i = 1; i <= nodes; ++i)
        d[i] = INF;

    fin.close();
}

void bell(){
    d[1] = 0;
    bool done;

    for (int ii = 1; ii < nodes; ++ii){
        done = 1;
        for (int i = 1; i <= nodes; ++i)
            for (unsigned int j = 0; j < v[i].size(); ++j)
                if (d[v[i][j].edge] > d[i] + v[i][j].weight)
                    d[v[i][j].edge] = d[i] + v[i][j].weight,
                    done = 0;
        if (done)
            break;
    }

    for (int i = 1; i <= nodes; ++i)
        for (unsigned int j = 0; j < v[i].size(); ++j)
            if (d[v[i][j].edge] > d[i] + v[i][j].weight){
                negCycle = 1;
                return;
            }
}

void write(){
    ofstream fout ("bellmanford.out");
    if (negCycle){
        fout << "Ciclu negativ!";
        fout.close();
        return;
    }
    for (int i = 2; i <= nodes; ++i)
        fout << d[i] << " ";
    fout.close();
}