Pagini recente » Cod sursa (job #184702) | Cod sursa (job #3282013) | Cod sursa (job #2338034) | Cod sursa (job #324016) | Cod sursa (job #2167479)
#include <fstream>
#include <algorithm>
#define oo 0x7fffffff
using namespace std;
ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");
struct graf
{
int nod, c;
graf *next;
};
struct muchie
{
int x, y, c;
} M[250001];
int n, m, dist[50001], a[50001], len;
graf * adj[50001];
/*struct noduri
{
int a;
bool operator<(const noduri x) const
{
return dist[a] > dist[x];
}
} ;*/
void add(int x, int y, int c)
{
graf *g = new graf;
g->nod = y;
g->c = c;
g->next = adj[x];
adj[x] = g;
}
bool bellman()
{
for (int i = 1; i <= n; i++)
dist[i] = oo;
dist[1] = 0;
a[0] = 1;
len = 1;
for (int i = 1; i < n; i++)
{
int new_len = len;
for (int j = 0; j < len; j++)
{
int nod = a[j], d = dist[nod];
graf *q = adj[nod];
while (q)
{
if (dist[q->nod] == oo)
{
a[new_len++] = q->nod;
}
dist[q->nod] = min(dist[q->nod], d + q->c);
q = q->next;
}
}
len = new_len;
make_heap(a, a + new_len);
pop_heap(a, a + new_len);
new_len--;
}
for (int j = 0; j < len; j++)
{
int nod = a[j], d = dist[nod];
graf *q = adj[nod];
while (q)
{
if (d + q->c < dist[q->nod])
return false;
q = q->next;
}
}
return true;
}
int main()
{
int x, y, c;
fin >> n >> m;
for (int i = 0; i < m; i++)
{
fin >> x >> y >> c;
add(x, y, c);
}
if(!bellman())
fout << "Ciclu negativ!";
else
for (int i = 2; i <= n; i++)
fout << dist[i] << ' ';
}