Pagini recente » Cod sursa (job #2205002) | Cod sursa (job #329447) | Cod sursa (job #2562524) | Cod sursa (job #1547143) | Cod sursa (job #1721628)
#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;
}