Pagini recente » Autentificare | Cod sursa (job #272714) | Cod sursa (job #1889976) | Cod sursa (job #607427) | Cod sursa (job #2373463)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream f("bellmanford.in");
ofstream g("bellmanford.out");
int n,m,r[50001],dist[50001];
struct abc
{
int x, y, z;
} muchii[250001];
vector <int> v[50001];
vector <pair<int, int> > h;
void solve()
{
pair<int, int> P;
int nod, poz;
int q=0;
while(h.size() && q<=1LL*n*m)
{
q++;
pop_heap(h.begin(), h.end());
P=h.back();
h.pop_back();
nod=P.second;
r[nod]=0;
for(int j=0; j<v[nod].size(); j++)
{
poz=v[nod][j];
if(dist[muchii[poz].x]+muchii[poz].z < dist[muchii[poz].y])
{
dist[muchii[poz].y]=dist[muchii[poz].x]+muchii[poz].z;
if(!r[muchii[poz].y])
{
r[muchii[poz].y]=1;
h.push_back(make_pair(-dist[muchii[poz].y], muchii[poz].y));
push_heap(h.begin(), h.end());
}
}
}
}
}
bool verif()
{
for(int i=1; i<=m; i++)
if(dist[muchii[i].x]+muchii[i].z < dist[muchii[i].y])
return 1;
return 0;
}
int main()
{
f>>n>>m;
for(int i=1; i<=m; i++)
{
f>>muchii[i].x>>muchii[i].y>>muchii[i].z;
v[muchii[i].x].push_back(i);
}
dist[1]=0;
for(int i=2; i<=n; i++)
dist[i]=1000000;
h.push_back(make_pair(0, 1));
make_heap(h.begin(), h.end());
solve();
if(verif())
{
g<<"Ciclu negativ!";
return 0;
}
for(int i=2; i<=n; i++)
g<<dist[i]<<" ";
return 0;
}