Cod sursa(job #886749)

Utilizator deea101Andreea deea101 Data 23 februarie 2013 11:04:09
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define nmax 1050
#define f first
#define s second
using namespace std;
ifstream f("pitici.in");
ofstream g("pitici.out");
vector < pair<int,int> > vec[nmax],vect[nmax],h;
vector <int> v;
int n,d[nmax][nmax],viz[nmax],mu[nmax];
void toposort(int nod)
{
    int i,x;
    viz[nod]=1;
    for(i=0;i<vec[nod].size();i++)
    {
        x=vec[nod][i].first;
        if(!viz[x])
            toposort(x);
    }
    v.push_back(nod);
}

void sift(int nod)
{
    int son=nod,s1,s2;
    do
    {
       nod=son; s1=2*nod; s2=2*nod+1;
       if(s1<h.size() && d[h[son].f][h[son].s]+mu[h[son].f]>d[h[s1].f][h[s1].s]+mu[h[s1].f]) son=s1;
       if(s2<h.size() && d[h[son].f][h[son].s]+mu[h[son].f]>d[h[s2].f][h[s2].s]+mu[h[s2].f]) son=s2;

        swap(h[nod],h[son]);

    }while(nod!=son);
}

void percolate(int nod)
{
    while(d[h[nod].f][h[nod].s]+mu[h[nod].f]<d[h[nod/2].f][h[nod/2].s]+mu[h[nod/2].f])
    {
        swap(h[nod],h[nod/2]);
        nod=nod/2;
    }
}
void adaugare(int x,int y)
{
    if(d[x][y] || (x==1 && y==1))
    {
        h.push_back(make_pair(x,y));
        percolate(h.size()-1);
    }
}

int main()
{
    int m,i,j,x,y,c,nod,k;
    f>>n>>m>>k;
    for(i=0;i<m;i++)
    {
        f>>x>>y>>c;
        vec[x].push_back(make_pair(y,c));
        vect[y].push_back(make_pair(x,c));
    }
    toposort(1);
    reverse(v.begin(),v.end());
    d[1][1]=0;
    for(i=1;i<n;i++)
    {
        h.clear();
        h.push_back(make_pair(0,0));

        nod=v[i];
        for(j=0;j<vect[nod].size();j++)
        {
            mu[vect[nod][j].first]=vect[nod][j].second;
            adaugare(vect[nod][j].first,1);
        }
        for(j=1;j<=k && h.size()>1 ;j++)
        {
            if(h.size()>1)
            {
                x=h[1].f;
                y=h[1].s;
                d[nod][j]=d[x][y]+mu[x];
                h[1]=h[h.size()-1];
                h.pop_back();
                sift(1);
                adaugare(x,y+1);
            }
        }
    }
    for(j=1;j<=k;j++)
        g<<d[n][j]<<' ';

}