Pagini recente » Cod sursa (job #1149457) | Cod sursa (job #592508) | Cod sursa (job #2784526) | Cod sursa (job #1707800) | Cod sursa (job #1373411)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define N 50005
#define oo 100000000
using namespace std;
ifstream f("bellmanford.in");
ofstream g("bellmanford.out");
int nrnoduri,m,nonnegativ=1;
int distanta[N],viz[N],nr[N];
queue <int> Q;
vector < pair<int,int> > Graf[N];
void citeste_fa()
{
int x,y,k,i;
pair <int,int> p;
f>>nrnoduri>>m;
for(i=1;i<=m;i++){
f>>x>>y>>k;
p=make_pair(y,k);
Graf[x].push_back(p);
} }
void aplica_bellman_ford_fa(int qq)
{
int i,auxq,nod,cost;
for(i=1;i<=nrnoduri;i++)
if(i!=qq) distanta[i]=oo;
Q.push(qq),viz[qq]=1;
while(!Q.empty()&&nonnegativ==1){
auxq=Q.front(),Q.pop(),viz[auxq]=0;
for(unsigned int j=0;j<Graf[auxq].size();j++){
nod=Graf[auxq][j].first,cost=Graf[auxq][j].second;
if(distanta[nod]>distanta[auxq]+cost){
distanta[nod]=distanta[auxq]+cost;
if(viz[nod]==0){
Q.push(nod),viz[nod]=1,nr[nod]++;
if(nr[nod]>nrnoduri) nonnegativ=0;
} } } } }
void afiseaza_fa(int qq)
{
if(nonnegativ==0){
g<<"Ciclu negativ!\n";
return;
}
for(int i=1;i<=nrnoduri;i++)
if(i!=qq) g<<distanta[i]<<' ';
g<<'\n';
}
int main()
{
citeste_fa();
aplica_bellman_ford_fa(1);
afiseaza_fa(1);
return 0;
}