Cod sursa(job #2858000)

Utilizator Teodor94Teodor Plop Teodor94 Data 26 februarie 2022 19:43:21
Problema Sate Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;

struct Edge {
  int node, cost;
};

#define MAX_N 30000
#define INF 1e9

int noNodes;
vector<Edge> graph[MAX_N];

queue<int> bfQueue;
bool marked[MAX_N];
int dist[MAX_N];

void addEdge(int a, int b, int cost) {
  graph[a].push_back({b, cost});
  graph[b].push_back({a, -cost});
}

void bf(int node) {
  int i;

  for (i = 0; i < noNodes; ++i)
    dist[i] = INF;

  dist[node] = 0;
  bfQueue.push(node);
  marked[node] = true;

  while (!bfQueue.empty()) {
    node = bfQueue.front();

    for (const Edge& edge : graph[node])
      if (dist[edge.node] > dist[node] + edge.cost) {
        dist[edge.node] = dist[node] + edge.cost;

        if (!marked[edge.node]) {
          bfQueue.push(edge.node);
          marked[node] = true;
        }
      }

    bfQueue.pop();
  }
}

int main() {
  FILE *fin, *fout;
  fin = fopen("sate.in", "r");
  fout = fopen("sate.out", "w");

  int m, x, y, a, b, c;
  fscanf(fin, "%d%d%d%d", &noNodes, &m, &x, &y);
  --x, --y;
  while (m--) {
    fscanf(fin, "%d%d%d", &a, &b, &c);
    addEdge(--a, --b, c);
  }

  bf(x);

  fprintf(fout, "%d\n", dist[y]);

  fclose(fin);
  fclose(fout);
  return 0;
}