Cod sursa(job #2129277)

Utilizator robx12lnLinca Robert robx12ln Data 12 februarie 2018 18:02:34
Problema Pitici Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 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];
vector<int> L[1024];
priority_queue< int, vector<int>, less<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 );
    }
    for( int i = 0; i < L[nod].size(); i++ ){
        int vecin = L[nod][i];
        for( int k = 1; k <= K && D[vecin][k] != INF; k++ ){
            q.push( D[vecin][k] + C[nod][vecin] );
            if( (int)q.size() == K + 1 )
                q.pop();
        }
    }
    for( int k = min( K, (int)q.size() ); k >= 1; k-- ){
        D[nod][k] = q.top();
        q.pop();
    }
    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;
}