Cod sursa(job #731705)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 8 aprilie 2012 22:18:56
Problema Pitici Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <cstdio>
#include <vector>
#include <set>
#include <queue>

using namespace std;

const int Nmax = 1030;

vector <pair <int, int> > next[Nmax], prev[Nmax];

queue <int> Q;

multiset <int> dist[Nmax];

int n, k, deg[Nmax];

void read() {
  int m, x, y, c;

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

  for (int i = 1; i <= m; ++i) {
    scanf("%d%d%d", &x, &y, &c);
    
    next[x].push_back(make_pair(y, c));
    prev[y].push_back(make_pair(x, c));
    deg[y]++;
  }
}

void solve() {
  dist[1].insert(0);
  Q.push(1);

  while (!Q.empty()) {
    int nod = Q.front(); Q.pop();

    for (int i = 0; i < (int)next[nod].size(); ++i) {
      --deg[next[nod][i].first];

      if (!deg[next[nod][i].first])
        Q.push(next[nod][i].first);
    }

    for (int i = 0; i < (int)prev[nod].size(); ++i)
      for (set <int>::iterator it = dist[prev[nod][i].first].begin(); it != dist[prev[nod][i].first].end(); ++it) {
        dist[nod].insert(*it + prev[nod][i].second);
        
        if ((int)dist[nod].size() > k)
          dist[nod].erase(--dist[nod].end());
      }
  }
}

void print() {
  for (set <int>::iterator it = dist[n].begin(); it != dist[n].end(); ++it)
    printf("%d ", *it);
}

int main() {
  freopen("pitici.in", "r", stdin);
  freopen("pitici.out", "w", stdout);

  read();

  solve();

  print();

  return 0;
}