Pagini recente » Cod sursa (job #2813359) | Cod sursa (job #508424) | Cod sursa (job #1133186) | Cod sursa (job #160747) | Cod sursa (job #586435)
Cod sursa(job #586435)
//Lambru Andrei Cristian - Arhiva Educationala
//Problema Bellman Ford
#include<stdio.h>
#include<malloc.h>
typedef struct _nod
{
int info;
int cost;
struct _nod *adr;
} nod;
typedef struct
{
struct _nod *cap;
} list;
list A[50001];
long long D[50001];
int viz[50001];
int N;
int M;
void add(int a,int b,int c)
{
nod *nou = (nod*)malloc(sizeof(nod));
nou->info = b;
nou->cost = c;
nou->adr = A[a].cap;
A[a].cap = nou;
}
void citire(void)
{
int a;
int b;
int c;
FILE *f = fopen("bellmanford.in","r");
fscanf(f,"%d %d",&N,&M);
for(int i=1;i<=M;i++)
{
fscanf(f,"%d %d %d",&a,&b,&c);
add(a,b,c);
}
fclose(f);
}
void add2(nod*& Cf,int a)
{
nod *nou = (nod*)malloc(sizeof(nod));
nou->info = a;
nou->adr = NULL;
Cf->adr = nou;
Cf = nou;
}
int parc(void)
{
nod *Ci = (nod*)malloc(sizeof(nod));
Ci->info = 1;
Ci->adr = NULL;
nod *Cf = Ci;
while(Ci)
{
nod *q = A[Ci->info].cap;
while(q)
{
if(!D[q->info] || D[q->info] > D[Ci->info] + q->cost)
{
if(viz[q->info] > N)
return 0;
viz[q->info] ++;
D[q->info] = D[Ci->info] + q->cost;
add2(Cf,q->info);
}
q = q->adr;
}
Ci = Ci->adr;
}
return 1;
}
int main()
{
FILE *g = fopen("bellmanford.out","w");
citire();
if(!parc())
fprintf(g,"Ciclu negativ!");
else
for(int i=2;i<=N;i++)
fprintf(g,"%d ",D[i]);
fclose(g);
return 0;
}