Cod sursa(job #3199512)

Utilizator Theo20067Cismaru Theodor-Alexe Theo20067 Data 1 februarie 2024 18:50:05
Problema Pitici Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define INF 1000000000
using namespace std;
ifstream fin ("pitici.in");
ofstream fout("pitici.out");
struct elem
{
    int x,c,nr;
};
struct cmp
{
    bool operator()(elem a,elem b)const { return a.c>b.c;}
};
int n,m,k,x,y,c,i,j,vecin,nr,cost,COST[1030][1030],D[1030][1030];
vector <pair<int,int>> L[1030];
vector <int> S_top;
bool viz[1030];
void dfs(int x)
{
    viz[x]=1;
    for(auto& j:L[x])
        if(!viz[j.second])
            dfs(j.second);
    S_top.push_back(x);
}
int main()
{
    fin>>n>>m>>k;
    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>c;
        COST[x][y]=c;
        L[x].push_back({c,y});
    }
    dfs(1);
    for(i=1;i<=n;i++)
        for(j=1;j<=k;j++)
            D[i][j]=INF;
    D[n][1]=0;
    for(auto& i:S_top)
    {
        priority_queue<elem,vector<elem>,cmp> Q;
        if(L[i].empty())
            continue;

        for(auto& j:L[i])
        {
            vecin=j.second;
            cost=j.first;
            Q.push({vecin,D[vecin][1]+cost,1});
        }
        for(j=1;j<=k&&!Q.empty();j++)
        {
            elem top=Q.top();
            Q.pop();
            vecin=top.x;
            cost=top.c;
            nr=top.nr;
            D[i][j]=cost;
            Q.push({vecin,D[vecin][nr+1]+COST[i][vecin],nr+1});

        }
    }
    for(i=1;i<=k;i++)
        fout<<D[1][i]<<" ";
    return 0;
}