Cod sursa(job #1746287)

Utilizator blatulInstitutul de Arta Gastronomica blatul Data 22 august 2016 23:57:16
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;
 
constexpr int kMaxN = 50000;
constexpr int kMaxM = 250000;
constexpr int NIL = -1;
 
struct Edge {
    int v, weight;
    int next;
} G[kMaxM];
 
int head[kMaxN];
int dist[kMaxN];
bool in_stack[kMaxN];
 
void df(const int node, const int depth_limit) {
	if (depth_limit == 0) {
		return;
	}
    in_stack[node] = true;
    for (int i = head[node]; i != NIL; i = G[i].next) {
        const int adj_node = G[i].v;
        if (dist[adj_node] >= dist[node] + G[i].weight) {
            dist[adj_node] = dist[node] + G[i].weight;
            if (not in_stack[adj_node]) {
                df(adj_node, depth_limit - 1);
            }
        }
    }
    in_stack[node] = false;
}
 
int main() {
	#ifdef INFOARENA
    ifstream cin("dijkstra.in");
    ofstream cout("dijkstra.out");
    #endif
    int n, m; cin >> n >> m;
     
    memset(head, NIL, 4 * n);
    for (int i = 0; i < m; i += 1) {
        int u, v, weight; cin >> u >> v >> weight;
        G[i].v = v - 1;
        G[i].weight = weight;
        G[i].next = head[u - 1];
        head[u - 1] = i;
    }
     
    memset(dist + 1, 0x3f, 4 * (n - 1));
    for (int depth = 1; depth <= 65536; depth <<= 1) {
    	df(0, depth);
    }
     
    for (int i = 1; i < n; i += 1) {
        cout << (dist[i] & -(dist[i] != 0x3f3f3f3f)) << " \n"[i == n - 1];
    }
    return 0;
}