Cod sursa(job #1610967)

Utilizator gapdanPopescu George gapdan Data 23 februarie 2016 21:00:04
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define NMAX 1300

using namespace std;

int n,m,k,i,j,c,x,y,fiu,nr,nod;
int a[NMAX][NMAX],G[NMAX][NMAX],D[NMAX],top[NMAX];
bool viz[NMAX];
struct punct
{
    int c,x,i;
}X;
vector<punct>H;
vector<int>v[NMAX];
punct pp(int a,int b,int c)
{
    punct X;X.c=a;X.x=b;X.i=c;
    return X;
}
bool cmp (const punct &p, const punct &r)
{
  return p.c > r.c;
}

void dfs(int nod)
{
    viz[nod]=1;
    for(int i=0; i<v[nod].size();++i)
        if(viz[v[nod][i]] == 0)
            dfs(v[nod][i]);

    top[++nr]=nod;
}

void sterge()
{
    pop_heap(H.begin(), H.end(), cmp);
    H.pop_back();
}
int main()
{
    freopen("pitici.in","r",stdin);
    freopen("pitici.out","w",stdout);
    scanf("%d%d%d",&n,&m,&k);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&c);
        v[y].push_back(x);
        G[y][x]=c;
    }
    nr=0;
    dfs(n);
    for(int t=1; t<=nr; ++t)
    {
        nod=top[t];
        H.clear();
        for(i=0; i<v[nod].size(); ++i)
        {
            fiu=v[nod][i];
            //bagaheap
            X=pp(a[fiu][1]+G[nod][fiu],fiu,1);
            H.push_back(X);
            push_heap(H.begin(),H.end(),cmp);
        }

        while(H.size() > 0 && D[nod] < k)
        {
                X=H[0];
                sterge();
                a[nod][++D[nod]]=X.c;
                if(X.i < D[X.x])
                {
                    ++X.i;
                    punct Y;
                    Y=pp(a[X.x][X.i]+G[nod][X.x],X.x,X.i);
                    H.push_back(Y);
                    push_heap(H.begin(),H.end(),cmp);
                }
        }
    }
    for(i=1; i<=k; ++i) printf("%d ",a[n][i]);
    return 0;
}