Pagini recente » Cod sursa (job #2140585) | Cod sursa (job #1019418) | Cod sursa (job #1152054) | Cod sursa (job #1515163) | Cod sursa (job #643286)
Cod sursa(job #643286)
#include <cstdio>
struct vecin
{
int nod,cost;
vecin* adr_urm;
};
vecin *vec[50001];
struct elc
{
int nod;
elc* adr_urm;
};
elc *top;
unsigned short int numapp[50001],eincoada[50001];
void vpush(int x,int y,int c)
{
vecin* tmp=new vecin;
tmp->nod=y;
tmp->cost=c;
tmp->adr_urm=vec[x];
vec[x]=tmp;
}
void push(int n)
{
elc* tmp=new elc;
tmp->nod=n;
tmp->adr_urm=top;
top=tmp;
}
void pop()
{
elc *tmp=top;
top=top->adr_urm;
delete tmp;
}
int main()
{
int cost[50001],n,m,x,y,c,nod;
bool cicneg=false;
top=NULL;
for(int i=0;i<=50000;i++)
{
cost[i]=2100000000;
eincoada[i]=numapp[i]=0;
vec[i]=NULL;
}
FILE *f=fopen("bellmanford.in","r");
fscanf(f,"%d %d\n",&n,&m);
for(int i=0;i<=m;i++)
{
fscanf(f,"%d %d %d",&x,&y,&c);
vpush(x,y,c);
}
fclose(f);
cost[1]=0;
push(1);
while(top&&!cicneg)
{
nod=top->nod;
pop();
eincoada[nod]=0;
for(vecin* curs=vec[nod];curs;curs=curs->adr_urm)
if(cost[nod]+curs->cost<cost[curs->nod])
{
cost[curs->nod]=cost[nod]+curs->cost;
if(!eincoada[curs->nod])
{
if(numapp[curs->nod]==n)
cicneg=true;
else
{
push(curs->nod);
numapp[curs->nod]++;
}
}
}
}
f=fopen("bellmanford.out","w");
if(cicneg)
fprintf(f,"Ciclu negativ!");
else
for(int i=2;i<=n;i++)
fprintf(f,"%d ",cost[i]);
return 0;
}