Cod sursa(job #1770983)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 5 octombrie 2016 08:52:03
Problema Sate Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include<bits/stdc++.h>
using namespace std;
typedef struct tip
{
    int a,b,d;
};
tip v[100035],v1[100005];
bool comp(tip a,tip b)
{
    if(a.a<b.a) return 1;
    if(a.a==b.a && a.b<b.b) return 1;
    return 0;
}
deque<int> q;
int n,m,x,y,z,st,dr,sol,mid;
int cost[30005];
int main()
{
    freopen("sate.in","r",stdin);
    freopen("sate.out","w",stdout);
    scanf("%d%d%d%d",&n,&m,&x,&y);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&v[i].a,&v[i].b,&v[i].d);
        v1[i].b=v[i].a;
        v1[i].a=v[i].b;
        v1[i].d=v[i].d;
    }
    sort(v+1,v+m+1,comp);
    sort(v1+1,v1+m+1,comp);
    cost[v[1].a]=1;
    for(int i=1;i<=n;i++)
    {
    if(cost[i])
    {
    q.push_back(i);
    while(!q.empty())
    {
        z=q.front();
        ///////////prima cautare
        st=1;
        dr=m;
        sol=0;
        while(st<=dr)
        {
            mid=(st+dr)>>1;
            if(v[mid].a==z)
            {
                sol=mid;
                dr=mid-1;
            }
                else
            if(v[mid].a>z)
            {
                dr=mid-1;
            }
                else
                st=mid+1;
        }
        while(sol<=n && v[sol].a==z)
        {
            if(!cost[v[sol].b])
            {
                cost[v[sol].b]=cost[z]+v[sol].d;
                q.push_back(v[sol].b);
            }
            sol++;
        }
        /////////////////
        st=1;
        dr=m;
        sol=0;
        while(st<=dr)
        {
            mid=(st+dr)>>1;
            if(v1[mid].a==z)
            {
                sol=mid;
                dr=mid-1;
            }
                else
            if(v1[mid].a>z)
            {
                dr=mid-1;
            }
                else
                st=mid+1;
        }
        while(sol<=n && v1[sol].a==z)
        {
            if(!cost[v1[sol].b])
            {
                cost[v1[sol].b]=cost[z]-v1[sol].d;
                q.push_back(v1[sol].b);
            }
            sol++;
        }
        q.pop_front();
    }
    }
    }
    printf("%d\n",cost[y]-cost[x]);
    return 0;
}