Cod sursa(job #3260101)

Utilizator BogdanBurescuBogdan Burescu BogdanBurescu Data 30 noiembrie 2024 10:19:36
Problema Algoritmul Bellman-Ford Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <vector>
#include <set>
#include <queue>
#define pii pair<int,int>

using namespace std;

ifstream cin ("bellmanford.in");
ofstream cout ("bellmanford.out");

long long int t,n,i,j,k,m,x,y,a,b,c,d[300005],ok[300005],u,v,w,sum,l,r,mini,nr,maxi,node,it;
const int MOD=1e9+7;
vector<pair<int,int>>g[300005];
set<pair<int,int>>s;
priority_queue < pii , vector < pii > , greater < pii > > pq;
queue<int>q;

void bellmanford()
{
    for(i=1;i<=n;i++)
        d[i]=1e9;
    d[1]=0;
    ok[1]=1;
    q.push(1);
    while(q.size() && it<=(n-1)*m)
    {
        int curr=q.front();
        q.pop();
        ok[curr]=0;
        for(auto x:g[curr])
        {
            int cost=x.first;
            int vec=x.second;
            if(d[curr]+cost<d[vec])
            {
                d[vec]=d[curr]+cost;
                if(ok[vec]==0)
                {
                    q.push(vec);
                    ok[vec]=1;
                }
            }
        }
        it++;
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin>>n>>m;
    for(i=1; i<=m; i++)
    {
        cin>>u>>v>>c;
        g[u].push_back({c,v});
    }
    bellmanford();
    for(i=1;i<=n;i++)
    {
        for(auto x:g[i])
            if(d[i]+x.second<d[x.first])
        {
            cout<<"Ciclu negativ!";
            return 0;
        }
    }
    for(i=2;i<=n;i++)
        cout<<d[i]<<' ';
    return 0;
}