Pagini recente » Cod sursa (job #1181642) | Cod sursa (job #44969) | Cod sursa (job #1352959) | Cod sursa (job #2202514) | Cod sursa (job #2424058)
#include <iostream>
#include <climits>
#include <fstream>
#include <list>
#include <vector>
#include <queue>
using namespace std;
#define inf INT_MAX/2
ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");
void citire(list <pair <int,int > > * &L, int &n, int &m)
{
fin>>n>>m;
L=new list<pair<int,int> >[n+1];
int x,y,c;
for(int i=0;i<m;i++)
{
fin>>x>>y>>c;
L[x].push_back({c,y});
}
}
void initializare(vector <int> &viz, vector <int> &d, vector<int> &esteincoada, int n)
{
d.resize(n+1);
viz.resize(n+1);
esteincoada.resize(n+1);
for(int i=1;i<=n;i++)
{
viz[i]=0;
esteincoada[i]=0;
d[i]=inf;
}
}
bool bellmanford(int s, int n, vector <int> &viz, vector <int> &d, vector<int> &esteincoada, list <pair <int,int > > *L )
{
queue <int> coada;
initializare(viz,d,esteincoada,n);
d[s] = 0;
coada.push(s);
esteincoada[s] = 1;
while(!coada.empty())
{
int nodcurent = coada.front();
viz[nodcurent]++;
if(viz[nodcurent] >= n)
return false;
coada.pop();
esteincoada[nodcurent] = 0;
for(pair <int,int> pr: L[nodcurent])
{
int y=pr.second;
int p=pr.first;
if(d[y]>d[nodcurent]+p)
{
d[y]=d[nodcurent]+p;
if(!esteincoada[y])
coada.push(y);
}
}
}
return true;
}
int main()
{
int n,m;
vector<int> d;
vector<int> viz;
vector<int> esteincoada;
list< pair< int, int> > *L;
citire(L,n,m);
if(bellmanford(1,n,viz,d,esteincoada,L))
{
for(int i=2;i<=n;i++)
fout<<d[i]<<" ";
}
else
fout<<"Ciclu negativ!";
return 0;
}