Cod sursa(job #1758890)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 18 septembrie 2016 00:39:41
Problema Reconst Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <cstdio>
#include <cstdlib>

#define MAXN 2000
#define MAXM 2000

int u, val[2*MAXM+1], next[2*MAXM+1];
int cost[2*MAXM+2], lista[MAXN+1], s[MAXN+1];
bool viz[MAXN+1];

void dfs(int x){
    int p=lista[x];
    viz[x]=1;
    while(p){
        if(viz[val[p]]==0){
            s[val[p]]=s[x]+cost[p];
            dfs(val[p]);
        }else if(s[val[p]]!=s[x]+cost[p]) exit(1);
        p=next[p];
    }
}

inline void adauga(int x, int y, int z){
    u++;
    val[u]=y;
    cost[u]=z;
    next[u]=lista[x];
    lista[x]=u;
}

int main(){
    int n, m, a, b, c, i;
    FILE *fin, *fout;
    fin=fopen("reconst.in", "r");
    fout=fopen("reconst.out", "w");
    fscanf(fin, "%d%d", &n, &m);
    for(i=1; i<=m; i++){
        fscanf(fin, "%d%d%d", &a, &b, &c);
        adauga(a-1, b, c);
        adauga(b, a-1, -c);
    }
    for(i=0; i<=n; i++)
        if(viz[i]==0)
            dfs(i);
    for(i=1; i<=n; i++)
        fprintf(fout, "%d ", s[i]-s[i-1]);
    fclose(fin);
    fclose(fout);
    return 0;
}