Pagini recente » Cod sursa (job #135098) | Diferente pentru implica-te/arhiva-educationala intre reviziile 31 si 30 | Cod sursa (job #236483) | Cod sursa (job #784676) | Cod sursa (job #862840)
Cod sursa(job #862840)
#include<fstream>
#include<vector>
#include<queue>
#define inf 300000000
using namespace std;
ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");
int n, m, nr[250008],cmin[50008];
struct vfc
{
int x,cost,ord;
};
vector<vfc> l[50008];
queue<int> q;
void citire();
void bellman();
void afisare();
int main()
{
citire();
bellman();
return 0;
}
void citire()
{
int x,y,c,i;
vfc save;
fin>>n>>m;
for(i=1; i<=m; i++)
{
fin>>x>>y>>c;
save.cost=c;
save.ord=i;
save.x=y;
l[x].push_back(save);
}
for(i=1;i<=n;i++)
cmin[i]=inf;
}
void bellman()
{
int i,modif=0,nod;
vfc save;
q.push(1);
cmin[1]=0;
while(!modif && !q.empty())
{
nod=q.front();
q.pop();
for(i=0;i<l[nod].size();i++)
{
save=l[nod][i];
if(cmin[nod]+save.cost<cmin[save.x])
{
cmin[save.x]=cmin[nod]+save.cost;
q.push(save.x);
nr[save.ord]++;
if (nr[save.ord]==n)
{
modif=1;
break;
}
}
}
}
if(modif)
fout<<"Ciclu negativ!";
else
afisare();
}
void afisare()
{
int i;
for(i=2;i<=n;i++)
fout<<cmin[i]<<' ';
}