Mai intai trebuie sa te autentifici.
Cod sursa(job #831929)
Utilizator | Data | 9 decembrie 2012 15:20:19 | |
---|---|---|---|
Problema | Algoritmul Bellman-Ford | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 0.95 kb |
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("bellmanford.in"); ofstream g("bellmanford.out");
const int inf=1<<30; const int N=50006;
int n,m,dist[N],use[N];
struct vecin {int varf,cost;};
vector <vecin> L[N];
queue <int> Q;
int main()
{ int x,y,c,i;
f>>n>>m;
while(m--)
{ f>>x>>y>>c;
L[x].push_back((vecin){y,c});
}
// Bellman-Ford
for(i=1; i<=n; i++) dist[i]=inf;
Q.push(1); dist[1]=0;
while(!Q.empty())
{ x=Q.front(); Q.pop();
use[x]++;
if(use[x]==n) {g<<"Ciclu negativ!\n"; return 0;}
vector <vecin> :: iterator it=L[x].begin(), sf=L[x].end();
for(; it!=sf; ++it)
{ if(dist[(*it).varf]>dist[x]+(*it).cost)
{ dist[(*it).varf]=dist[x]+(*it).cost;
Q.push((*it).varf);
}
}
}
for(i=2; i<=n; i++) g<<dist[i]<<" ";
g<<"\n"; return 0;
}