Pagini recente » Cod sursa (job #2948525) | Cod sursa (job #2653791) | Cod sursa (job #3252085) | Cod sursa (job #1181839) | Cod sursa (job #2154153)
#include <cstdio>
#include <vector>
using namespace std;
#define NMAX 50005
#define INFINIT 1000000000
typedef pair<int, int> ii;
vector<ii> a[NMAX];
int n, m, source, d[NMAX];
bool change = true;
void BlmnFord(){
int i, j, x=1;
ii nod;
while(x <= n-1 && change){
change = false;
for(i=1; i<=n; i++){
for(j=0; j<(int) a[i].size(); j++){
nod = a[i][j];
if(d[ nod.first ] > d[ i ] + nod.second){
d[ nod.first ] = d[ i ] + nod.second;
change = true;
}
}
}
x++;
}
if(x == n)
change = false;
}
bool negCicle(){
int i, j;
ii nod;
for(i=1; i<=n; i++){
for(j=0; j<(int) a[i].size(); j++){
nod = a[i][j];
if(d[ nod.first ] > d[ i ] + nod.second){
return true;
}
}
}
return false;
}
int main(){
int i, j, x, y, c;
FILE *fin, *fout;
fin = fopen("bellmanford.in", "r");
fout = fopen("bellmanford.out", "w");
fscanf(fin, "%d %d", &n, &m);
for(i=1; i<=m; i++){
fscanf(fin, "%d %d %d", &x, &y, &c);
a[x].push_back(ii(y, c));
}
source = 1;
for(i=1; i<=n; i++)
d[i] = INFINIT;
d[source] = 0;
BlmnFord();
if(change && negCicle())
fprintf(fout, "Ciclu negativ!\n");
else
for(i=2; i<=n; i++)
fprintf(fout, "%d ", d[i]);
return 0;
}