Cod sursa(job #414194)

Utilizator adrianraduleaRadulea Adrian adrianradulea Data 9 martie 2010 20:13:39
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<stdio.h>
#include<string.h>
FILE *f,*g;
long t[4][250500],c[50500],i,n,m,st[100000],dist[50500],y,z,nr,p,u,q,viz[50500],x,fin[50500]; 
char cr;
int main()
{ f=fopen("dijkstra.in","r"); g=fopen("dijkstra.out","w");
  fscanf(f,"%ld%ld",&n,&m); fscanf(f,"%c",&cr);
  for(i=1;i<=m;i++)
   { x=0; y=0; z=0;
     //fscanf(f,"%s",&sir); lung=strlen(sir)-1; j=0;
	// while(j<=lung) { x=x*10+sir[j]-'0'; j++; } 
	// fscanf(f,"%s",&sir); lung=strlen(sir)-1; j=0;
	// while(j<=lung) { y=y*10+sir[j]-'0'; j++; } 
	// fscanf(f,"%s",&sir); lung=strlen(sir)-1; j=0;
	 //while(j<=lung) { z=z*10+sir[j]-'0'; j++; } 
	 while(cr!=' ') 
	 { fscanf(f,"%c",&cr); 
	   if(cr!=' ') x=x*10+cr-'0'; }; cr='a';
	 while(cr!=' ') 
	 { fscanf(f,"%c",&cr); if(cr!=' ') y=y*10+cr-'0'; }; cr='a';
	 while(cr!='\n') 
	 { fscanf(f,"%c",&cr); if(cr!='\n') z=z*10+cr-'0'; } 
     if(c[x]==0) { nr++; c[x]=nr; t[1][nr]=y; t[3][nr]=z; fin[x]=nr; }
	 else { nr++; t[2][fin[x]]=nr; t[1][nr]=y; t[3][nr]=z; fin[x]=nr; }
   }
  p=u=1; st[1]=1; dist[1]=0; viz[1]=1;
  while(p<=u)
   { q=c[st[p]]; 
     while(q!=0) 
	  { if(dist[t[1][q]]>dist[st[p]]+t[3][q]||viz[t[1][q]]==0) { dist[t[1][q]]=dist[st[p]]+t[3][q]; viz[t[1][q]]=1; u++; st[u]=t[1][q]; }
	    q=t[2][q];
	  }
	 p++;
   }
  for(i=2;i<=n;i++) fprintf(g,"%ld ",dist[i]);
  fclose(g);
  return 0;
}