Cod sursa(job #397165)

Utilizator vladiiIonescu Vlad vladii Data 16 februarie 2010 15:56:22
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

int N, M, X, Y, D[30001];
vector<pair<int, int> > G[30001];
queue<int> Q;
bool viz[30001];

int main() {
    fstream f1, f2;
    int i, j, p, q;
    f1.open("sate.in", ios::in);
    f1>>N>>M>>X>>Y;
    for(i=1; i<=M; i++) {
         f1>>p>>q>>j;
         G[p].push_back(make_pair(q, j));
         G[q].push_back(make_pair(p, j));
    }
    f1.close();
    //plec din X si ajung in Y
    viz[X]=1;
    for(vector<pair<int, int> >::iterator it=G[X].begin(); it!=G[X].end(); it++) {
         viz[(*it).first]=1;
         D[(*it).first]=(*it).second;
         Q.push((*it).first);
    } 
    while(!Q.empty()) {
         p=Q.front(); Q.pop();
         for(vector<pair<int, int> >::iterator it=G[p].begin(); it!=G[p].end(); it++) {
              i=(*it).first; j=(*it).second;
              if(!viz[i]) {
                   viz[i]=1; Q.push(i);
                   if(i<p && p<X) {
                        D[i]=D[p]+j;
                   }
                   else if(p<i && p<X && i<X) {
                        D[i]=D[p]-j;
                   }
                   else if(p<X && X<i) {
                        D[i]=j-D[p];
                   }
                   else if(X<p && p<i) {
                        D[i]=D[p]+j;
                   }
                   else if(X<p && X<i && i<p) {
                        D[i]=D[p]-j;
                   }
                   else if(X<p && i<X) {
                        D[i]=j-D[p];
                   }
              }
         }
         if(viz[Y]) { break; }
    }
    f2.open("sate.out", ios::out);
    f2<<D[Y]<<endl;
    f2.close();
    return 0;
}