Cod sursa(job #1938289)

Utilizator iulianrotaruRotaru Gheorghe-Iulian iulianrotaru Data 24 martie 2017 19:08:44
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 kb
#include <bits/stdc++.h>
#define A first
#define B second
using namespace std;
class InputReader {
    public:
        InputReader() {}
        InputReader(const char *file_name) {
            input_file = fopen(file_name, "r");
            cursor = 0;
            fread(buffer, SIZE, 1, input_file);
        }
        inline InputReader &operator >>(int &n) {
            while((buffer[cursor] < '0' || buffer[cursor] > '9')&& buffer[cursor]!='-') {
                advance();
            }
            semn=1;
            if(buffer[cursor]=='-')
            {
                semn=-1;
                advance();
            }
            n = 0;
            while('0' <= buffer[cursor] && buffer[cursor] <= '9') {
                n = n * 10 + buffer[cursor] - '0';
                advance();
            }
            n*=semn;
            return *this;
        }
    private:
        FILE *input_file;
        static const int SIZE = 1 << 20;
        int cursor,semn;
        char buffer[SIZE];
        inline void advance() {
            ++ cursor;
            if(cursor == SIZE) {
                cursor = 0;
                fread(buffer, SIZE, 1, input_file);
            }
        }
}f("pitici.in");
ofstream g("pitici.out");
int n,m,k,i,j,a,b,c,x,P[1<<10],L[1<<10],C[1<<10];
bool viz[1<<10];
vector<int> S[1<<10],G[1<<10];
vector<pair<int,int> > R[1<<10];
priority_queue <pair <int,int> ,vector <pair <int,int> > ,greater <pair <int,int> > > H;
void dfs(int x)
{
    viz[x]=1;
    for(int i=0;i<G[x].size();++i)
        if(!viz[G[x][i]]) dfs(G[x][i]);
    P[++P[0]]=x;
}
int main()
{
    f>>n>>m>>k;
    while(m--)
    {
        f>>a>>b>>c;
        G[a].push_back(b);
        R[b].push_back(make_pair(a,c));
    }
    dfs(1);
    S[1].push_back(0);
    for(i=n-1;i;--i)
    {
        while(!H.empty()) H.pop();
        x=P[i];
        for(j=0;j<R[x].size();++j)
        {
            L[R[x][j].A]=0;
            C[R[x][j].A]=R[x][j].B;
            H.push(make_pair(S[R[x][j].A][0]+R[x][j].B,R[x][j].A));
        }
        while(S[x].size()<k&&!H.empty())
        {
            pair<int,int> K=H.top();
            H.pop();
            S[x].push_back(K.A);
            if(++L[K.B]<S[K.B].size())
                H.push(make_pair(S[K.B][L[K.B]]+C[K.B],K.B));
        }
    }
    for(i=0;i<k;++i) g<<S[n][i]<<' ';
    return 0;
}