Cod sursa(job #1722046)

Utilizator liviu23Liviu Andrei liviu23 Data 27 iunie 2016 09:45:12
Problema Algoritmul Bellman-Ford Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#define f first
#define s second
#define DIM 50005
#define INF 250000000
using namespace std;

int n,m,dist[DIM];
vector<pair<int,int> > adj[DIM];
bitset<DIM> used;

bool isNegativeCycle() {
    for(int i=2;i<=n;i++)
        dist[i]=INF;
    queue<int> q;
    q.push(1);
    used[1]=true;
    while(!q.empty()) {
        int u=q.front();
        for(int i=0;i<adj[u].size();i++) {
            if(dist[adj[u][i].f]>dist[u]+adj[u][i].s) {
                dist[adj[u][i].f]=dist[u]+adj[u][i].s;
                if(!used[adj[u][i].f]) {
                    used[adj[u][i].f]=true;
                    q.push(adj[u][i].f);
                }
            }
        }
        used[u]=false;
        q.pop();
    }
    for(int i=1;i<=n;i++)
        for(int j=0;j<adj[i].size();j++)
            if(dist[i]+adj[i][j].s<dist[adj[i][j].f])
                return true;
    return false;
}

int main()
{
    ifstream fin("bellmanford.in");
    ofstream fout("bellmanford.out");
    fin>>n>>m;
    int a,b,c;
    for(int i=1;i<=m;i++) {
        fin>>a>>b>>c;
        adj[a].push_back({b,c});
    }
    if(isNegativeCycle())
        fout<<"Ciclu negativ!";
    else
        for(int i=2;i<=n;i++)
            fout<<dist[i]<<" ";
    return 0;
}