Cod sursa(job #68097)

Utilizator floringh06Florin Ghesu floringh06 Data 26 iunie 2007 14:11:25
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
//100 puncte 
// parcurgere bf + coada circulara
//Complextate O(m+n)
using namespace std;

#define MAX_N 30005
#define MAX_V 50

#include <stdio.h>
#include <fstream>

FILE *fin=fopen("sate.in","r"),
     *fout=fopen("sate.out","w");
     
typedef struct 
 {
   int v;
   int c;
 } lista;
 
lista p[MAX_N][MAX_V]; //lista de vecini ptr reprezentarea grafului
int el[MAX_N];
int v[MAX_N];
int d[MAX_N];
int coada[MAX_N];     
int n,m,x,y;

void buildgraf (void)
{
  int i,x0,y0,d;
  memset(el,0,sizeof(el));
  fscanf(fin,"%d %d %d %d",&n,&m,&x,&y);
  for (i=1; i<=m; i++) {
   fscanf(fin,"%d %d %d",&x0,&y0,&d);
   el[x0]++; el[y0]++;
   p[x0][el[x0]].v=y0; p[x0][el[x0]].c=d;
   p[y0][el[y0]].v=x0; p[y0][el[y0]].c=-d;
}  }
   
void bf () 
{
  int i,li=1,lf=1,vf;
  memset(v,0,sizeof(v));
  memset(d,0,sizeof(d));
  v[x]=1; coada[lf++]=x;
  while (li!=lf)
   {
     vf=coada[(li++)%MAX_N]; v[vf]=1;
     for (i=1; i<=el[vf]; i++)
      if (v[p[vf][i].v]==0) 
       {
         coada[(lf++)%MAX_N]=p[vf][i].v;
         v[p[vf][i].v]=1;
         d[p[vf][i].v]=d[vf]+p[vf][i].c;
       }
   }
  fprintf(fout,"%d\n",d[y]);
} 

int main()
{
  buildgraf();

  bf();
  
  fclose(fin);
  fclose(fout);
  
  return 0;
}