Cod sursa(job #1721628)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 26 iunie 2016 05:43:36
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

const int N_MAX = 1050;
const int K_MAX = 1050;
const int INF = 0x3f3f3f3f;

int N, M, K;
vector<int> Graph[N_MAX];
vector<int> revGraph[N_MAX];
int Degree[N_MAX];
int Sort[N_MAX];
int pathIndex[N_MAX];
int Cost[N_MAX][N_MAX];
int minPath[N_MAX][K_MAX];
queue<int> Queue;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> Heap;

void topSort() {
  for(int i = 1; i <= N; i++) {
    if(Degree[i] == 0) {
      Queue.push(i);
    }
  }
  int sortPos = 1;
  while(!Queue.empty()) {
    int Node = Queue.front();
    Sort[sortPos] = Node;
    sortPos++;
    Queue.pop();
    for(vector<int> :: iterator it = Graph[Node].begin(); it != Graph[Node].end(); ++it) {
      Degree[*it]--;
      if(Degree[*it] == 0) {
        Queue.push(*it);
      }
    }
  }
}

void getMinPaths() {
  for(int i = 1; i <= N; i++) {
    for(int j = 1; j <= K; j++) {
      minPath[i][j] = INF;
    }
  }
  minPath[1][1] = 0;
  for(int i = 2; i <= N; i++) {
    while(!Heap.empty()) {
      Heap.pop();
    }
    int Node = Sort[i];
    for(vector<int> :: iterator it = revGraph[Node].begin(); it != revGraph[Node].end(); ++it) {
      pathIndex[*it] = 1;
      Heap.push(make_pair(minPath[*it][1] + Cost[*it][Node], *it));
    }
    for(int j = 1; j <= K; j++) {
      int Path = Heap.top().first;
      int Source = Heap.top().second;
      Heap.pop();
    
      if(Path == INF) {
        break;
      }
      
      minPath[Node][j] = Path;
      pathIndex[Source]++;
      Heap.push(make_pair(minPath[Source][pathIndex[Source]] + Cost[Source][Node], Source));
    }
  }
}

int main() {
  ifstream f("pitici.in");
  ofstream g("pitici.out");
  
  f >> N >> M >> K;
  
  for(int i = 1; i <= M; i++) {
    int A, B, C;
    
    f >> A >> B >> C;
    Graph[A].push_back(B);
    revGraph[B].push_back(A);
    Cost[A][B] = Cost[B][A] = C;
    Degree[B]++;
  }
  
  topSort();
  getMinPaths();
  
  for(int i = 1; i <= K; i++) {
    g << minPath[N][i] << (i == K ? '\n' : ' ');
  }
  
  return 0;
}