Cod sursa(job #3176853)

Utilizator puica2018Puica Andrei puica2018 Data 27 noiembrie 2023 21:27:29
Problema Pitici Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("pitici.in");
ofstream fout("pitici.out");

int n,m,k;
int a,b,c;

int viz[1020],out[1020];

vector <pair <int,int>> g[1020];

vector <int> ord;

int dp[1020][1020],cnt[1020],costEdge[1020];

void dfs(int nod)
{
    viz[nod]=1;
    for(auto p:g[nod])
        if(viz[p.first]==0)
            dfs(p.first);
    ord.push_back(nod);
}

priority_queue <pair <int,int>,vector <pair <int,int>>,greater <pair <int,int>>> h;

int main()
{
    fin>>n>>m>>k;
    for(int i=1; i<=m; i++)
    {
        fin>>a>>b>>c;
        g[a].push_back(make_pair(b,c));
        out[a]++;
    }
    dfs(1);
    for(int i=1; i<=n; i++)
        for(int j=1; j<=k; j++)
            dp[i][j]=1e9;
    for(auto u:ord)
    {
        if(out[u]==0)
        {
            if(u==n)
                dp[u][1]=0;
            continue;
        }
        while(!h.empty())
            h.pop();
        for(auto e:g[u])
        {
            int v=e.first,c=e.second;
            h.push(make_pair(dp[v][1]+c,v));
            costEdge[v]=c;
            cnt[v]=2;
        }
        for(int i=1; i<=k; i++)
        {
            pair <int,int> aux=h.top();
            h.pop();
            h.push(make_pair(dp[aux.second][cnt[aux.second]++]+costEdge[aux.second],aux.second));
            dp[u][i]=min(dp[u][i],aux.first);
        }
    }
    for(int i=1; i<=k; i++)
        fout<<dp[1][i]<<" ";
    fout<<"\n";
    return 0;
}