Cod sursa(job #1572709)

Utilizator nicula_iulianNicula Iulian nicula_iulian Data 19 ianuarie 2016 01:48:55
Problema Sate Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include<fstream>
#include<algorithm>
using namespace std;
struct sat{
int val1,val2,distanta;
}vect[200050];
bool cmp(sat a,sat b)
{
    if(a.val1==b.val1) return a.val2<b.val2;
    else return a.val1<b.val1;
}
int inceput[30002],dist[30002];
bool vizitat[30002];
int main()
{int n,m,x,y,i,k=1,coada[30002],prim,ultim,vf;
ifstream f("sate.in");
ofstream g("sate.out");
f>>n>>m>>x>>y;
for(i=1;i<=m;i++)
{
    f>>vect[k].val1>>vect[k].val2>>vect[k].distanta;
    k++;
    vect[k].val1=vect[k-1].val2;
    vect[k].val2=vect[k-1].val1;
    vect[k].distanta=vect[k-1].distanta;
    k++;
}
sort(vect+1,vect+2*m+1,cmp);
inceput[vect[1].val1]=1;
dist[vect[1].val2]=vect[1].distanta;
vizitat[vect[1].val1]=true;
for(i=2;i<=2*m;i++)
  if(vect[i].val1!=vect[i-1].val1) inceput[vect[i].val1]=i;
  prim=1;
  ultim=1;
  coada[prim]=vect[1].val1;
  while(prim<=ultim)
  {
     vf=coada[prim];
     prim++;
     for(i=inceput[vf];vect[i].val1==vf;i++)
        if(vizitat[vect[i].val2]==false){
            ultim++;
            coada[ultim]=vect[i].val2;
            vizitat[vect[i].val2]=true;
            if(vf>vect[i].val2) dist[vect[i].val2]=dist[vf]-vect[i].distanta;
            else dist[vect[i].val2]=dist[vf]+vect[i].distanta;
        }
  }
//for(i=1;i<=2*m;i++)
//    g<<vect[i].val1<<" "<<vect[i].val2<<" "<<vect[i].distanta<<"\n";
//for(i=1;i<=n;i++)
//    g<<inceput[i]<<"\n";
//for(i=1;i<=n;i++)
//    g<<dist[i]<<"\n";
if(x>y) swap(x,y);
if(x==vect[i].val1) g<<dist[y];
else
g<<dist[y]-dist[x];
f.close();
g.close();
return 0;
}