Cod sursa(job #1011876)

Utilizator assa98Andrei Stanciu assa98 Data 17 octombrie 2013 18:14:37
Problema Algoritmul Bellman-Ford Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;

struct pereche {
    int a,b;
    pereche() {
        a=b=0;
    }
    pereche(int x,int y) {
        a=x;
        b=y;
    }
};

class cmp {
public:
    inline bool operator() (const pereche &a,const pereche &b) {
        return a.b>b.b;
    }
};

const int MAX_N=50100;
const int INF=1000000000;   

vector<pereche> A[MAX_N];

queue<int> Q;

int inQ[MAX_N];
int cinQ[MAX_N];

int dmin[MAX_N];

int cycle;

int n;

void bellman() {
    dmin[1]=0;
    Q.push(pereche(1,0));
    inQ[1]=1;
    cinQ[1]=1;

    while(!Q.empty() &&!cycle ) {
        int nod=Q.front();
        int cst=dmin[nod];

        Q.pop();
        inQ[nod]=0;

        for(vector<pereche>::iterator it=A[nod].begin();it!=A[nod].end();it++) {
            if(dmin[*it]>cst+it->b) {
                dmin[it->a]=cst+it->b;
                if(!inQ[it->a])
                    Q.push(pereche(it->a,dmin[it->a]));
                    inQ[it->a]=1;
                    cinQ[it->a]++;

                    if(cinQ[it->a]>n) {
                        cycle=1;
                        return;
                    }
                }
        }

    }
}

int main() {
    freopen("bellmanford.in","r",stdin);
    freopen("bellmanford.out","w",stdout);
    int m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++) {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        A[a].push_back(pereche(b,c));
    }
    
    for(int i=1;i<=n;i++) {
        dmin[i]=INF;
    }
    bellman();
    
    if(cycle) {
        printf("Ciclu negativ!");
        return 0;
    }

    for(int i=2;i<=n;i++) {
        if(dmin[i]==INF) {
            printf("0 ");
        }
        else {
            printf("%d ",dmin[i]);
        }
    }

    return 0;
}