Pagini recente » Cod sursa (job #2946102) | Cod sursa (job #895223)
Cod sursa(job #895223)
#include<cstdio>
#include<list>
#include<vector>
#include<queue>
#define inf 210000
using namespace std;
FILE *fin= fopen("bellmanford.in", "r");
FILE *fout=fopen("bellmanford.out","w");
int i,j,n,m,c,d[50001];
struct nod
{
int cost,nr;
}p;
struct aaa
{
int d,nr;
}q;
class maimic
{
public:
bool operator ()(aaa a, aaa b)
{
return a.d>b.d;
}
};
list<nod> lista;
list<nod>:: iterator it;
vector< list<nod> > l(50001,lista);
priority_queue<aaa,vector<aaa>,maimic> heap;
int minimize()
{
int ok=0;
while(heap.size())
{
int ok=0;
j=heap.top().nr;
for(it=l[j].begin();it!=l[j].end();++it)
if(d[it->nr]>d[j]+it->cost)
{
q.d=d[it->nr];
q.nr=it->nr;
heap.push(q);
d[it->nr]=d[j]+it->cost;
}
heap.pop();
}
return ok;
}
int main()
{
fscanf(fin,"%d%d",&n,&m);
for(int ii=1;ii<=m;++ii)
{
fscanf(fin,"%d%d%d",&i,&j,&c);
nod p;
p.nr=j; p.cost=c;
l[i].push_back(p);
}
q.d=1; q.nr=1;
heap.push(q);
for(i=2;i<=n;++i)
{
d[i]=inf;
q.d=d[i];
q.nr=1;
heap.push(q);
}
for(i=1;i<=n-1;++i)
minimize();
int ok=minimize();
if(ok)
fprintf(fout,"Ciclu negativ!");
else
for(i=2;i<=n;++i)
fprintf(fout,"%d ",d[i]);
return 0;
}