Cod sursa(job #1058319)

Utilizator auRSTARHreapca Aurelian auRSTAR Data 15 decembrie 2013 13:20:38
Problema Sate Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.3 kb
#include<cstdio>
#include<vector>
#include<bitset>
#include<deque>
#include<algorithm>
#include<cstring>
using namespace std;
bitset<30010> in_q;
vector<pair<int,int> >V[30010];
deque<int> Q;
void read(),solve();
int n,m,A,B,a,b,c,cost[30010];
int main()
{
    read();
    solve();
    return 0;
}
void read()
{
    freopen("sate.in","r",stdin);
    freopen("sate.out","w",stdout);
    scanf("%d%d%d%d",&n,&m,&A,&B);
    if(A>B)swap(A,B);
    for(;m;--m)
    {
        scanf("%d%d%d",&a,&b,&c);
        if(a>b)swap(a,b);
        V[a].push_back(make_pair(b,c));
        V[b].push_back(make_pair(a,-c));
    }
    memset(cost,355,sizeof(cost));
}
void solve()
{
    in_q[A]=1;
    Q.push_back(A);
    cost[A]=0;
    for(;!Q.empty();)
    {
        a=Q.front();
        for(vector<pair<int,int> >::iterator it=V[a].begin();it!=V[a].end();it++)
        {
            b=it->first;
            c=it->second;
            if(cost[b]>cost[a]+c)
            {
                cost[b]=cost[a]+c;
                if(b==B)break;
                if(!in_q[b])
                {
                    Q.push_back(b);
                    in_q[b]=1;
                }
            }
        }
        if(b==B)break;
        in_q[a]=0;
        Q.pop_front();
    }
    printf("%d\n",cost[B]);
}