Cod sursa(job #2106178)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 15 ianuarie 2018 11:00:40
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<bits/stdc++.h>
#define inf 1000000000
#define maxN 1035
using namespace std;

typedef struct tip
{
    int x,y,z;
    bool operator<(const tip& other) const
    {
        return x>other.x;
    }
};
bool seen[maxN];
int k,n;
int st[maxN];
vector<pair<int,int> > v[maxN];
int dp[1035][1035];
inline void dfs(int nod)
{
    for(int i=1;i<=k;i++)
        dp[nod][i]=inf;
    seen[nod]=1;
    if(nod==n)
    {
        dp[nod][1]=0;
        return;
    }
    priority_queue<tip> q;
    while(!q.empty()) q.pop();
    bool leaf=1;
    for(vector<pair<int,int> >::iterator it=v[nod].begin();it!=v[nod].end();it++)
    {
       // if(!seen[it->first])
       if(!seen[it->first])   dfs(it->first);
        {
            leaf=0;

            st[it->first]=1;
            q.push({dp[it->first][1]+it->second,it->first,it->second});
        }
    }

    for(int i=1;i<=k;i++)
    {
        if(q.empty()) break;
        int val=q.top().x;
        int nw=q.top().y;
        int edg=q.top().z;
        q.pop();
        dp[nod][i]=val;
        st[nw]++;
        q.push({dp[nw][st[nw]]+edg,nw,edg});
    }
}
int m,x,y,z;
int main()
{
    freopen("pitici.in","r",stdin);
    freopen("pitici.out","w",stdout);


    scanf("%d%d%d",&n,&m,&k);


    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        v[x].push_back({y,z});
        //v[y].push_back({x,z});
    }


    dfs(1);

    for(int i=1;i<=k;i++)
        printf("%d ",dp[1][i]);
    return 0;
}