Cod sursa(job #198643)

Utilizator JohnnyBravoJohnny Bravo JohnnyBravo Data 13 iulie 2008 14:32:05
Problema Reconst Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

struct query {
    int A, B, S;
};

const int MAX_N = 2005;
const int MAX_Q = 2005;
const int UNKNOWN = 2000000001;

ifstream in("reconst.in");
ofstream out("reconst.out");

int N, M;
query Q[MAX_Q];
vector <int> L[MAX_N];
int sum[MAX_N];


int main() {
    in >> N >> M;
    for(int i = 0; i < M; ++i) {
        in >> Q[i].A >> Q[i].B >> Q[i].S;
        --Q[i].A;
        L[Q[i].A].push_back(i);
        L[Q[i].B].push_back(i);
    }

    for(int i = 0; i <= N; ++i)
        sum[i] = UNKNOWN;

    queue <int> C;
    for(int i = 0; i <= N; ++i)
        if(sum[i] == UNKNOWN) {
            sum[i] = 0;
            C.push(i);
            while(!C.empty()) {
                int j = C.front();
                C.pop();
                for(vector <int> :: iterator it = L[j].begin(); it != L[j].end(); ++it)
                    if(j == Q[*it].A) {
                        if(sum[Q[*it].B] == UNKNOWN) {
                            sum[Q[*it].B] = sum[j] + Q[*it].S;
                            C.push(Q[*it].B);
                        }
                    }
                    else {
                        if(sum[Q[*it].A] == UNKNOWN) {
                            sum[Q[*it].A] = sum[j] - Q[*it].S;
                            C.push(Q[*it].A);
                        }
                    }
            }
        }

    for(int i = 1; i <= N; ++i)
        out << sum[i] - sum[i - 1] << " ";

    return 0;
}