Cod sursa(job #925551)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 24 martie 2013 16:51:27
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <fstream>
#include <deque>
#include <bitset>

using namespace std;

struct element
{
    long long int lungime;
    long long int indice;
    element *next;
};

struct nod
{
    element *cap;
    element *coada;
}v[30001];

void add(long long int a,long long int b,long long int lung)
{
    if(v[a].cap==NULL)
    {
        //cout<<"s-a creat capul pe "<<a<<endl;
        v[a].cap=new element;
        v[a].coada=new element;
        v[a].coada=v[a].cap;
        (v[a].cap)->lungime=lung;
        (v[a].cap)->indice=b;
        (v[a].cap)->next=NULL;
    }
    else
    {
        //cout<<"in v["<<a<<"] s-a adaigat "<<b<<endl;
        element *aux=new element;
        aux->indice=b;
        aux->lungime=lung;
        aux->next=NULL;
        (v[a].coada)->next=aux;
        v[a].coada=aux;
    }

    if(v[b].cap==NULL)
    {
        //cout<<"s-a creat capul pe "<<b<<endl;
        v[b].cap=new element;
        v[b].coada=new element;
        v[b].coada=v[b].cap;
        (v[b].cap)->lungime=-lung;
        (v[b].cap)->indice=a;
        (v[b].cap)->next=NULL;
    }
    else
    {
        //cout<<"in v["<<b<<"] s-a adaigat "<<a<<endl;
        element *aux=new element;
        aux->indice=a;
        aux->lungime=-lung;
        aux->next=NULL;
        (v[b].coada)->next=aux;
        v[b].coada=aux;
    }
}

#define TYPE pair<int,long long int>

deque<TYPE> x;
bitset<30001> frec;

int bfs(int plecare,int cautat)
{
    x.push_back(make_pair(plecare,0));

    element *i;

    while(x.size()!=0)
    {
//        cout<<x.front().first<<' '<<x.front().second<<endl;
        if(x.front().first==cautat)
        {
            return x.front().second;
        }
        for(i=v[x.front().first].cap;i!=NULL;i=i->next)
        {
            if(!frec[i->indice])
            {
                x.push_back(make_pair(i->indice,x.front().second+i->lungime));
                frec[i->indice]=1;
            }
        }
        x.pop_front();
    }
}

int main()
{
    ifstream fin("sate.in");
    ofstream fout("sate.out");

    int n,m;
    fin>>n>>m;
    int x,y,care_x,care_y,i;
    long long int lung;

    fin>>care_x>>care_y;
    for(i=0;i<m;i++)
    {
        fin>>x>>y>>lung;
        add(x,y,lung);
    }
/*
    element *p;
    for(p=v[1].cap;p!=NULL;p=p->next)
    {
        cout<<p->indice<<endl;
    }*/
    fout<<bfs(care_x,care_y)<<'\n';
    fin.close();
    fout.close();
    return 0;
}