Cod sursa(job #519586)

Utilizator APOCALYPTODragos APOCALYPTO Data 5 ianuarie 2011 23:17:46
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.84 kb
using namespace std;
#include<iostream>
#include<fstream>
#include<vector>
#define pb push_back
#define L ((i)*2)
#define R ((L)+1)
#define T ((i)/2)
#define oo 0x3f3f3f3f
#define nmax 10000
struct nod{
short lg,c;};
ofstream fout("scara3.out");

vector<nod> G[nmax];

//int N,K,L;
int N,nh,K,eL;
long long d[nmax];
short poz[nmax];
short H[nmax];
long long bani[nmax];

void upheap(int i)
{    int m;
    if(i<=1) return ;
    if(d[H[i]]<d[H[T]])
        m=T;
        else if(d[H[i]]==d[H[T]] && bani[H[i]]<bani[H[T]])
                  m=T;
    if(i!=m) swap(H[i],H[T]),swap(poz[H[i]],poz[H[T]]), upheap(T);

}

void downheap(int i)
{
    int m;
    m=i;
    if(L<=nh)
    {
        if(d[H[L]]<d[H[m]])
        {
            m=L;
        }
        else
        if(d[H[L]]==d[H[m]])
        {
            if(bani[H[L]]<bani[H[m]])
              m=L;
        }
    }
    if(R<=nh)
    {
        if(d[H[R]]<d[H[m]])
        {
            m=R;
        }
        else
        if(d[H[R]]==d[H[m]])
        {
            if(bani[H[R]]<bani[H[m]])
            {
                m=R;
            }
        }
    }
    if(m!=i) swap(H[i],H[m]),swap(poz[H[i]],poz[H[m]]), downheap(m);
}
void solve()
{vector<nod>::iterator it;
int i,u;
    for(i=1;i<=N;i++)
    {
        d[i]=oo;
        H[i]=i;
        poz[i]=i;
        bani[i]=oo;
    }

    d[1]=0;
    bani[1]=0;
    nh=N;

    while(nh)
    {
        u=H[1];
        swap(H[1],H[nh]);
        swap(poz[H[1]],poz[H[nh]]);
        nh--;
        downheap(poz[H[1]]);
        for(it=G[u].begin();it<G[u].end();it++)
        {
            if(d[it->lg]>d[u]+1)
            {
                d[it->lg]=d[u]+1;
                bani[it->lg]=bani[u]+it->c;

                upheap(poz[it->lg]);
            }
            if(d[it->lg]==d[u]+1)
            {
                if(bani[it->lg]>bani[u]+it->c)
                {
                    bani[it->lg]=bani[u]+it->c;
                }
                upheap(poz[it->lg]);
            }
        }

    }
    //if(d[N]==20 && bani[N]==38)
    //if(bani[N]==0)
      fout<<d[N]<<" "<<bani[N]<<"\n";
    //else
      //fout<<d[N]<<" "<<bani[N]<<"\n";
}

void cit()
{int i,j,ord,c;
    ifstream fin("scara3.in");
    fin>>N;
    fin>>K;
    N++;
    for(i=1;i<=N-1;i++)
    {
        G[i].pb((nod){i+1,0});
    }
    for(i=1;i<=K;i++)
    {

        fin>>ord>>c;
        //util[ord]=c;
        ord++;
        for(j=ord+1;j<=ord+c;j++)
            G[ord].pb((nod){j,0});

    }
    fin>>eL;
    for(i=1;i<=eL;i++)
    {
        fin>>ord>>c;
        ord++;
        for(j=1;j<=c;j++)
        {
            G[ord].pb((nod){ord+j*2-1,j});
            G[ord].pb((nod){ord+j*2,j});
        }
    }

}

int main()
{

    cit();
    solve();
    fout.close();
    return 0;
}