Cod sursa(job #1564610)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 9 ianuarie 2016 20:04:25
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <bits/stdc++.h>
#define Nmax 1050
#define pb push_back

using namespace std;

int dp[Nmax][Nmax],n,k,v[Nmax],c[Nmax],wh[Nmax],vec[Nmax],l;
bool viz[Nmax];

struct Edge
{
    int nod,cost;
    bool operator <(const Edge &A) const
    {
        return cost>A.cost;
    }
};
vector <Edge> L[Nmax],T[Nmax];
priority_queue <Edge> Q;

inline void Solve(int nod)
{
    while(!Q.empty()) Q.pop();
    int len=0,ind=1,i;
    Edge w;
    for(auto it : T[nod])
    {
        v[++len]=it.nod; c[it.nod]=it.cost;
        wh[it.nod]=1;
    }
    for(i=1;i<=len;++i)
    {
        w.nod=v[i]; w.cost=dp[v[i]][1]+c[v[i]];
        Q.push(w);
    }
    while(!Q.empty() && ind<=k)
    {
        w=Q.top(); Q.pop();
        dp[nod][ind]=w.cost;
        ++wh[w.nod];
        if(dp[w.nod][wh[w.nod]]!=-1)
        {
            w.cost=dp[w.nod][wh[w.nod]]+c[w.nod];
            Q.push(w);
        }
        ++ind;
    }
    dp[nod][ind]=-1;
}

inline void Dfs(int nod)
{
    viz[nod]=true;
    for(auto it : L[nod])
        if(!viz[it.nod]) Dfs(it.nod);
    vec[++l]=nod;
}

int main()
{
    int m,x,y,z,i;
    Edge w;
    ifstream cin("pitici.in");
    ofstream cout("pitici.out");
    cin>>n>>m>>k;
    while(m--)
    {
        cin>>x>>y>>w.cost;
        w.nod=y; L[x].pb(w);
        w.nod=x; T[y].pb(w);
    }
    dp[1][2]=-1;
    Dfs(1);
    for(i=n-1;i;--i) Solve(vec[i]);
    for(i=1;i<=k;++i) cout<<dp[n][i]<<" ";
    cout<<"\n";
    return 0;
}