Cod sursa(job #2554804)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 23 februarie 2020 13:39:43
Problema Sate Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <iostream>
#include <cstdio>
#define NMAX 30000

using namespace std;

struct vecin {
  int sat, dist;
} st[NMAX + 5], dr[NMAX + 5];

int n, m, x, y;

void update_dr(int sat1, int sat2, int dist) {
  int auxs, auxd;

  while(dist)
    if(dist > dr[sat1].dist) {
      if(dr[sat1].dist == 0) {
        dr[sat1].dist = dist;
        dr[sat1].sat = sat2;
        st[sat2].dist = dist;
        st[sat2].sat = sat1;
      }
      else {
        dist -= dr[sat1].dist;
        sat1 = dr[sat1].sat;
      }
    }
    else {
      auxs = dr[sat1].sat;
      auxd = dr[sat1].dist;
      dr[sat1].sat = sat2;
      dr[sat1].dist = dist;
      st[sat2].sat = sat1;
      st[sat2].dist = dist;
      sat1 = sat2;
      dist = auxd - dist;
      sat2 = auxs;
    }
}

void update_st(int sat1, int sat2, int dist) {
  int auxs, auxd;

  while(dist)
    if(dist > st[sat1].dist) {
      if(st[sat1].dist == 0) {
        st[sat1].dist = dist;
        st[sat1].sat = sat2;
        dr[sat2].dist = dist;
        dr[sat2].sat = sat1;
      }
      else {
        dist -= st[sat1].dist;
        sat1 = st[sat1].sat;
      }
    }
    else {
      auxs = st[sat1].sat;
      auxd = st[sat1].dist;
      st[sat1].sat = sat2;
      st[sat1].dist = dist;
      dr[sat2].sat = sat1;
      dr[sat2].dist = dist;
      sat1 = sat2;
      dist = auxd - dist;
      sat2 = auxs;
    }
}

int main() {
  freopen("sate.in", "r", stdin);
  freopen("sate.out", "w", stdout);
  int a, b, d, auxs, auxd;

  scanf("%d %d %d %d", &n, &m, &x, &y);
  for(int i = 1; i <= m; i++) {
    scanf("%d %d %d", &a, &b, &d);
    auxs = st[b].sat;
    auxd = st[b].dist;
    update_dr(a, b, d);
    update_st(b, auxs, auxd);
  }

  auxd = 0;
  auxs = x;
  while(auxs != y) {
    auxd += dr[auxs].dist;
    auxs = dr[auxs].sat;
  }

  printf("%d", auxd);

  return 0;
}