Cod sursa(job #1832619)

Utilizator Bodo171Bogdan Pop Bodo171 Data 20 decembrie 2016 16:33:34
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
const int dim=(1<<10);
struct pq_member
{
   int loc,dist;
}el;
struct comp
{
    bool operator()(pq_member unu,pq_member doi)
    {
        return unu.dist>doi.dist;
    }
};
vector<int> v[dim],rev[dim];
priority_queue < pq_member,vector<pq_member>,comp> pq;
int d[dim][dim],cost[dim][dim];
int sortop[dim],ind[dim];
bool viz[dim];
int n,m,k,a,b,c,i,cnt,j,node,prec,ki;
void dfs(int x)
{
    viz[x]=1;
    for(int i=0;i<v[x].size();i++)
        if(!viz[v[x][i]])
          dfs(v[x][i]);
    ki++;sortop[ki]=x;
}
int main()
{
    ifstream f("pitici.in");
    ofstream g("pitici.out");
    f>>n>>m>>k;
    for(i=1;i<=m;i++)
    {
        f>>a>>b>>c;
        v[a].push_back(b);
        rev[b].push_back(a);
        cost[a][b]=c;
    }
    dfs(1);
    for(i=1;i<=n;i++)
        for(j=1;j<=k+1;j++)
          d[i][j]=(1<<30);
    d[1][1]=0;
    for(cnt=n;cnt>=1;cnt--)
    {
        node=sortop[cnt];
        for(i=0;i<rev[node].size();i++)
        {
            prec=rev[node][i];
            ind[prec]=1;
            el.loc=prec;
            el.dist=d[prec][ind[prec]]+cost[prec][node];
            pq.push(el);
        }
        for(i=1;i<=k&&(!pq.empty());i++)
        {
            el=pq.top();pq.pop();
            d[node][i]=el.dist;
            ind[el.loc]++;
            el.dist=d[el.loc][ind[el.loc]]+cost[el.loc][node];
            pq.push(el);
        }
        while(!pq.empty()) pq.pop();
    }
    for(i=1;i<=k;i++)
        g<<d[n][i]<<' ';
    return 0;
}