Pagini recente » Cod sursa (job #154474) | Arbori de intervale si aplicatii in geometria computationala | Cod sursa (job #1500043) | Cod sursa (job #2886768) | Cod sursa (job #2040302)
#include<fstream>
#include<deque>
#include<vector>
#include<climits>
#include<cstring>
using namespace std;
ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");
const int NMAX=50005,INF=INT_MAX;
vector<pair<int,int>>v[NMAX];
deque<int>d;
int n,m;
int dist[NMAX],rep[NMAX];
bool ciclu;
void citire(){
int x,y,c,i;
fin>>n>>m;
for(i=1;i<=m;++i){
fin>>x>>y>>c;
v[x].push_back(make_pair(y,c));
}
}
void bellmanford(){
for(int i=2;i<=n;++i)
dist[i]=INF;
dist[1]=0;
rep[1]=1;
d.push_back(1);
while(!d.empty()&&!ciclu){
int nod=d.front();
d.pop_front();
if(rep[nod]>n)
ciclu=true;
else{
int j;
for(j=0;j<v[nod].size();++j){
int cost=v[nod][j].second;
int vecin=v[nod][j].first;
if(dist[nod]+cost<dist[vecin]){
++rep[vecin];
dist[vecin]=dist[nod]+cost;
d.push_back(vecin);
}
}
}
}
}
void afisare(){
int i;
if(!ciclu)
for(i=2;i<=n;++i){
if(dist[i]==INF)
dist[i]=0;
fout<<dist[i]<<' ';
}
else
fout<<"Ciclu negativ!";
}
int main(){
citire();
bellmanford();
afisare();
}