Cod sursa(job #133579)

Utilizator FlorianFlorian Marcu Florian Data 8 februarie 2008 23:25:14
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include<stdio.h>
#include<stdlib.h>
#define Max 30000
FILE*f=fopen("sate.in","r");
FILE*g=fopen("sate.out","w");
typedef struct NOD
  {
  int info, cost;
  NOD *urm;
  }Nod;
Nod *prim[Max], *ultim[Max];
int n,m,X,Y,viz[Max];
void insert(int x, int y, int cost)
  {
  Nod *p,*q;
  p=new Nod;
  p->info=y;
  p->cost=cost;
  p->urm=NULL;
  if(prim[x]==NULL) prim[x]=ultim[x]=p;
  else
    {
    ultim[x]->urm=p;
    ultim[x]=p;
    }
  q=new Nod;
  q->info=x;
  q->cost=cost;
  q->urm=NULL;
  if(prim[y]==NULL) prim[y]=ultim[y]=q;
  else
    {
    ultim[y]->urm=q;
    ultim[y]=q;
    }
  }
void debug()
  {
  int i;
  Nod *q;
  for(i=1;i<=n;++i)
   {
   fprintf(g,"\n%d: ",i);
   for(q=prim[i];q;q=q->urm)
      fprintf(g,"%d ",q->info);
   }
  }

void DF(int x, int cost)
  {
   viz[x]=1;
   if(x==Y)
	{
	fprintf(g,"%d\n",cost);
	exit(0);
	}

   Nod *q;
   for(q=prim[x];q!=NULL;q=q->urm)
	{
	if(viz[q->info]==0)
	  {
	  viz[q->info]=1;
	  if(q->info>x)  DF(q->info,cost+(q->cost));
	  else DF(q->info, cost-(q->cost));
	  }
	}
  }
void read()
  {
  fscanf(f,"%d %d %d %d",&n,&m,&X,&Y);
  int i,x,y,d;
  while(m--)
    {
    fscanf(f,"%d %d %d",&x,&y,&d);
    insert(x,y,d);
    }
 }
int main()
 {
 read();
 DF(X,0);
 debug();
 return 0;
 }