Cod sursa(job #276141)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 10 martie 2009 21:41:48
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<stdio.h>
#include<vector>
#include<string>
using namespace std;
FILE*fin=fopen("sate.in","r");
FILE*fout=fopen("sate.out","w");
#define nm 30005
#define mkp make_pair
#define pb push_back
#define f first
#define s second
int n,m,x,y,f[nm],q[nm],cm[nm],viz[nm],next[nm];
vector<pair<int,int> >g[nm];
inline void bf()
{
  q[0]=1;q[1]=x;cm[1]=0;f[1]=0;
  memset(viz,0,sizeof(viz));
  viz[x]=1;
  int i=1,nod,nnod,j;
  while(i<=q[0])
  {
    nod=q[i];
    for(j=0;j<g[nod].size();j++)
    {
      nnod=g[nod][j].f;                        
      if(viz[nnod]) continue;
      viz[nnod]=1;
      q[0]++;
      q[q[0]]=nnod;
      f[q[0]]=i;
      cm[q[0]]=g[nod][j].s;
      if(nnod==y) return ;
    }
    i++;
  }
}
int main()
{
  int ans=0,i,a,b,c,nod,last;
  fscanf(fin,"%d%d%d%d",&n,&m,&x,&y);
  if(y<x) x^=y^=x^=y;
  for(i=1;i<=m;i++)
  {
    fscanf(fin,"%d%d%d",&a,&b,&c);
    g[a].pb(mkp(b,c));
    g[b].pb(mkp(a,c));
  }
  bf();
  nod=q[0];
  while(nod!=1)
  {
    next[f[nod]]=nod;
    nod=f[nod];
  }
  nod=1;
  last=0;
  next[q[0]]=q[0]+1;
  while(nod<=q[0])
  {
    if(q[nod]>last) ans+=cm[nod];
    else ans-=cm[nod];
    last=q[nod];
    nod=next[nod];
  }
  fprintf(fout,"%d",ans);
  fclose(fin);
  fclose(fout);
  return 0;
}