Pagini recente » Cod sursa (job #1181764) | Monitorul de evaluare | Cod sursa (job #1489235) | Cod sursa (job #2759914) | Cod sursa (job #2856743)
#include <fstream>
#include <queue>
#include <vector>
#define NMAX 50007
#define INF 1e9
using namespace std;
ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");
struct varf
{
int x;
int cost;
};
vector<varf> G[NMAX]; ///lsite de adiacenta u costuri
queue<int> C;
bool uz[NMAX];
bool bf();
int n, x0 = 1, x, vf, cost1, m, rez;
int cmin[NMAX], pre[NMAX];
int nr[NMAX];///nr[i] = nr drumuri de cost minim de la x la i
void afisare();
void citire();
int main()
{
citire();
rez = bf();
afisare();
return 0;
}
void citire()
{
int i,j,c;
varf aux;
nr[x0] = 1;
fin>>n>>m;
while(fin>>i>>j>>c)
{
///in lista de adiacenta a lui i trebuie sa adaug (j,c)
aux.x=j;
aux.cost=c;
G[i].push_back(aux);
}
for(i=1; i<=n; i++) cmin[i]=INF;
cmin[x0]=0;
}
bool bf()
{
///initializez coada cu vrarful de start
C.push(x0);
nr[0] = 1;
while(!C.empty())
{
x = C.front();
C.pop();
for (int i = 0; i < G[x].size(); i++)
{
vf = G[x][i].x;
cost1 = G[x][i].cost;
if (cmin[vf] > cmin[x]+cost1)
{
cmin[vf] = cmin[x]+cost1;
C.push(vf);
nr[vf]++;
if (nr[vf] == n) return 0;///exista circuite de cost negativ
}
}
}
return 1;
}
void afisare()
{
if (rez == 0) fout << "Ciclu negativ!";
else for (int i = 2; i <= n; i++) fout << cmin[i] << ' ';
}