Cod sursa(job #195247)

Utilizator marinMari n marin Data 17 iunie 2008 10:10:36
Problema PScNv Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <cstdio>
#include <cstdlib>
#define NMAX 250009
#define KMAX 1002
#define MAX(x,y) ((x>y)?(x):(y))
using namespace std;

int ww[NMAX],n,m;

struct nod{int c,k; nod *urm;};

struct hd  {nod *p,*q;} lst[NMAX];


struct idd{int c; idd *urm;};

struct intlist{idd *p,*q; void pb(int x);};

void intlist::pb(int x){
  idd *id;
  id=new idd;
  id->c=x;id->urm=NULL;
  if(!p) p=q=id;
  else
    q=q->urm=id;
};

int kk=-1001;

void kmin(int source){
  register int nd,xx,i,j;
  nod *y1;
  idd *po;
  intlist x1[KMAX];
  for(i=0;i<kk;i++)
    x1[i].p=x1[i].q=NULL;



  x1[0].pb(source);po=x1[0].p;
  j=0;nd=0;
  for(i=1;i<=n;++i){

    xx=0;
    while(!xx&&j<kk){

      po=x1[j].p;
      if(po){
	do{
	  nd=po->c;po=po->urm;
	  x1[j].p=po;
	  if(ww[nd]==j) xx=1;
	}while(!xx&&po);
	if(!xx) j++;
      }
      else j++;
    }

    for (y1=lst[nd].p;y1;y1=y1->urm){
      xx=MAX(ww[nd],y1->k);
      if(xx<ww[y1->c]){
	ww[y1->c]=xx;
	x1[xx].pb(y1->c);
      }
    }
  }
}

int main(){
  register int x,y,i,a,b,pd;
  nod *y1;
  FILE *in=fopen("pscnv.in","r");
  FILE *out=fopen("pscnv.out","w");
  fscanf(in,"%d %d %d %d",&n,&m,&x,&y);
  for(i=1;i<=n;i++){
    lst[i].p=lst[i].q=NULL;
    ww[i]=KMAX;
  }

//  int kk=-1001;
  for(i=1;i<=m;i++){
    fscanf(in,"%d %d %d",&a,&b,&pd);
	if (pd>kk) kk=pd;
    if(a!=b){
      y1=new nod;
      y1->c=b;y1->k=pd;y1->urm=NULL;
      if(!lst[a].p) lst[a].p=lst[a].q=y1;
      else
	lst[a].q=lst[a].q->urm=y1;
    }
  }
  ww[x]=0;
  kmin(x);
  fprintf(out,"%d",ww[y]);
  fclose(in);fclose(out);
  return 0;
}