Cod sursa(job #766234)

Utilizator mi5humihai draghici mi5hu Data 10 iulie 2012 17:57:14
Problema Algoritmul Bellman-Ford Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <stdio.h>
#include <vector>
#define NMAX 50001
#define inf 50000001
using namespace std;

vector< pair<int, int> > edges[NMAX];
int dist[NMAX];
int n, m;

void read_() {
     int source, dest, cost;
         
     scanf("%d%d", &n, &m);
     for (int i = 0; i < m; i++) {
         scanf("%d%d%d", &source, &dest, &cost);
         edges[source].push_back(make_pair(dest, cost)); 
     }     
}

void print_error() {
     printf("Ciclu negativ!");
}

void print_() {
     for (int i = 2; i <= n; i++) {
         printf("%d ", dist[i]);
     }
}     

void sw(int &a, int &b) {
     int aux = a;
     a = b; 
     b = aux;     
}

void BellmanFord() {
      vector<int>::iterator it_q;
      vector< pair<int, int> >::iterator it_n;
      int Edg[2][50001];
      int free[2];
      
      free[0] = 0;
      free[1] = 0;
             
      dist[1] = 0;
      for (int i = 2; i <= n; i++) {
          dist[i] = inf;                         
      }   
      Edg[1][free[1]++] = 1; 
      
      int nr_old = 0;
      int nr_new = 1;
      
      for (int i = 1; i <= n; i++) {
          while (free[nr_new] > 0) {
              int u = Edg[nr_new][--free[nr_new]];
              for (it_n = edges[u].begin(); it_n != edges[u].end(); it_n++) {
                  int v = (*it_n).first;
                  int c = (*it_n).second;
                  if (dist[u] + c < dist[v]) {
                      Edg[nr_old][free[nr_old]++] = v; 
                      dist[v] = dist[u] + c;             
                  }
              }
          }          
          sw(nr_old, nr_new);
      }                 
      
      if (free[nr_new] > 0) {
         print_error();
      } else {
         print_();
      }
}

int main() {
    freopen("bellmanford.in", "r", stdin);
    freopen("bellmanford.out", "w", stdout);
    
    read_();
    BellmanFord();
    
    return 0;
}