Cod sursa(job #2129288)

Utilizator robx12lnLinca Robert robx12ln Data 12 februarie 2018 18:16:14
Problema Pitici Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include<fstream>
#include<queue>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
ifstream fin("pitici.in");
ofstream fout("pitici.out");
const int INF = 0x3f3f3f3f;
int D[1024][1024], N, M, K, f[1024], C[1024][1024], Nxt[1024];
vector<int> L[1024];
priority_queue< pair<int,int>, vector< pair<int,int> >, greater< pair<int,int> > > q;
void dfs( int nod ){
    f[nod] = 1;
    for( int i = 0; i < L[nod].size(); i++ ){
        int vecin = L[nod][i];
        if( f[vecin] == 0 )
            dfs( vecin );
    }
    memset( Nxt, 0, sizeof(Nxt) );
    for( int i = 0; i < L[nod].size(); i++ )
        q.push( { D[ L[nod][i] ][1] + C[nod][ L[nod][i] ], L[nod][i]  } );
    for( int k = 1; k <= K && !q.empty(); k++ ){
        D[nod][k] = q.top().first;
        int node = q.top().second;
        Nxt[node]++;
        q.pop();
        q.push( { D[node][ 1 + Nxt[node] ] + C[nod][node], node } );
    }
    return;
}
int main(){
    fin >> N >> M >> K;
    for( int i = 1; i <= M; i++ ){
        int x, y, z;
        fin >> x >> y >> z;
        C[x][y] = z;
        L[x].push_back( y );
    }
    //D[i][j] = al j-lea drum ca lungime de la nodul N la nodul i
    memset( D, INF, sizeof(D) );
    D[N][1] = 0;
    dfs( 1 );
    for( int i = 1; i <= K; i++ )
        fout << D[1][i] << " ";
    return 0;
}