Cod sursa(job #779176)

Utilizator ionut_blesneagIonut Blesneag ionut_blesneag Data 16 august 2012 22:25:30
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<cstdio>
#include<cstring>
#include<list>
using namespace std;

int N,M,X,Y,i,j,D,k,anfang,ende,abstand,found;
struct coada {int dist;  int name;};
coada queue[400005];
int viz[30001];
struct village {int nod; int cost;};
list<village> L[30001];
list<village>::iterator it;
village q;
int nrc;
char buff[50];

int get_number()
{int nrn=0;
while(buff[nrc]<='9' && buff[nrc]>='0')
   {nrn=nrn*10+buff[nrc]-'0';
   nrc++;}
return nrn;
}

int main()
{freopen("sate.in","r",stdin);
freopen("sate.out","w",stdout);
gets(buff);
nrc=0;
N=get_number();
nrc++;
M=get_number();
nrc++;
X=get_number();
nrc++;
Y=get_number();
for(k=1; k<=M; k++)
  {gets(buff);
   nrc=0;
   i=get_number();
   nrc++;
   j=get_number();
   nrc++;
   D=get_number();
   village v1,v2;
   v1.nod=j;   v1.cost=D;  
   v2.nod=i;   v2.cost=D;
   L[i].push_back(v1);
   L[j].push_back(v2);}

anfang=1;  ende=1;
queue[1].name=X; 
viz[1]=1;  
while(anfang<=ende)   
{for(it=L[queue[anfang].name].begin(); it!=L[queue[anfang].name].end(); it++)
  {q=*it;
   if(viz[q.nod]==0)
    {viz[q.nod]=1;
     ende++;
     queue[ende].name=q.nod;
     if(queue[anfang].name<queue[ende].name)
        queue[ende].dist=queue[anfang].dist+q.cost;
     else
        queue[ende].dist=queue[anfang].dist-q.cost;   
        
     if(q.nod==Y)
        {found=queue[ende].dist;
         break;}   
     }
  }   
anfang++;
}
printf("%d",found);
return 0;}