Pagini recente » Cod sursa (job #2949400) | Cod sursa (job #1981525) | Cod sursa (job #2802180) | Cod sursa (job #424595) | Cod sursa (job #862158)
Cod sursa(job #862158)
#include<fstream>
#include<queue>
using namespace std;
ifstream f("bellmanford.in");
ofstream g("bellmanford.out");
#define nmax 50010
int ok[nmax],nok[nmax],dist[nmax],n,m,i,e;
struct nod
{
int nr,cst;
nod *adr;
} *a[nmax];
queue <int> q;
void citire()
{
f>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y,z;
f>>x>>y>>z;
nod *p=new nod;
p->nr=y;
p->cst=z;
p->adr=a[x];
a[x]=p;
}
}
void parcurgere(int x)
{
for(nod *p=a[x];p!=NULL;p=p->adr)
{
if(dist[p->nr]>dist[x]+p->cst)
{
dist[p->nr]=dist[x]+p->cst;
if(ok[p->nr]==0)
{
nok[p->nr]=ok[p->nr]=1;
q.push(p->nr);
}
else
{
nok[p->nr]++;
if(nok[p->nr]==n)
{
g<<"Graful are un ciclu negativ";
e=1;
}
}
}
}
q.pop();
if(!q.empty() && e==0)
parcurgere(q.front());
}
int main()
{
citire();
for(i=2;i<=n;i++)
dist[i]=50000000;
parcurgere(1);
if(e==1)
return 0;
for(i=2;i<=n;i++)
{
if(dist[i]==50000000)
g<<0;
else
g<<dist[i]<<' ';
}
return 0;
}