Cod sursa(job #1554018)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 20 decembrie 2015 20:22:28
Problema Drumuri minime Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <bits/stdc++.h>

using namespace std;

const int kMaxN = 1500;
const int kMaxM = 2500;
const int kMod = 104659;
const double kInf = 1000000000000000.0;
const double kEps = 0.00000001;
const int NIL = -1;

struct Edge {
  int v, next;
  double cost;
};

Edge l[2 * kMaxM];
int adj[kMaxN];

double minCost[kMaxN];
int solutionCount[kMaxN];

queue <int> Q;
bool inQueue[kMaxN];

void addEdge(const int &u, const int &v, const double &cost, const int &pos) {
  l[pos].v = v;
  l[pos].cost = cost;
  l[pos].next = adj[u];
  adj[u] = pos;
}

void bellmanFord(int N) {
  for (int i = 1; i < N; i++) {
    minCost[i] = kInf;
    inQueue[i] = 0;
  }

  Q.push(0);
  solutionCount[0] = 1;
  minCost[0] = .0;
  while (!Q.empty()) {
    int u = Q.front();
    Q.pop();
    inQueue[u] = 0;
    for (int i = adj[u]; i != NIL; i = l[i].next) {
      int v = l[i].v;
      double cost = minCost[u] + l[i].cost;
      double costDif = minCost[v] - cost;
      if (costDif > kEps) {
        minCost[v] = cost;
        solutionCount[v] = solutionCount[u];
        if (!inQueue[v]) {
          inQueue[v] = 1;
          Q.push(v);
        }
      } else if (fabs(costDif) <= kEps) {
        solutionCount[v] = (solutionCount[v] + solutionCount[u]);
        solutionCount[v] -= (kMod & -(solutionCount[v] >= kMod));
      }
    }
  }
}

int main(void) {
  ifstream in("dmin.in");
  ofstream out("dmin.out");
  in.tie(0);
  ios_base::sync_with_stdio(0);
  int N, M;
  int u, v, x;

  assert(in >> N >> M);
  assert(1 <= N && N <= kMaxN);
  assert(1 <= M && M <= kMaxM);
  for (int i = 0; i < N; i++) {
    adj[i] = NIL;
  }
  for (int i = 0; i < M; i++) {
    assert(in >> u >> v >> x);
    assert(1 <= u && u <= N);
    assert(1 <= v && v <= N);
    assert(2 <= x && x <= 1000000000);
    double cost = log(static_cast <double> (x));
    addEdge(u - 1, v - 1, cost, 2 * i);
    addEdge(v - 1, u - 1, cost, 2 * i + 1);
  }
  in.close();

  bellmanFord(N);

  for (int i = 1; i < N; i++) {
    assert(0 <= solutionCount[i] && solutionCount[i] < kMod);
    out << solutionCount[i] << ' ';
  }
  out << '\n';
  out.close();
  return 0;
}