Cod sursa(job #2197614)

Utilizator DragosArseneDragos Arsene DragosArsene Data 22 aprilie 2018 16:19:26
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <iostream>
#include <stdio.h>
#include <vector>
#include <set>
using namespace std;

int main() {
    FILE *fin, *fout;
    int n, m, i, j, c, t, ns , x, y, nod, d, nodcurent, distanta, steag;
    vector <pair<int, int> > v[50001];
    int distdat[100001], distgg[100001];
    set <pair<int, int> > s;

fin = fopen("distante.in", "r");
fout = fopen("distante.out", "w");

fscanf(fin,"%d", &t);

for(j=1;j<=t;j++){

fscanf(fin,"%d%d%d", &n, &m, &ns);
for(i=1;i<=n;i++){
    distgg[i]=2000000000;
    distdat[i]=2000000000;
}







fscanf(fin,"%d%d%d", &n, &m, &ns);
for(i=1;i<=n;i++){
    while(v[i].empty()==false)
        v[i].pop_back();
}
while(s.empty()==false){
    s.erase(*s.begin());
}
for(i=1;i<=n;i++){
    fscanf(fin,"%d", &distdat[i]);
    for(i=1;i<=m;i++){
            fscanf(fin,"%d%d%d", &x, &y, &c);
            v[x].push_back(make_pair(y, c));
            v[y].push_back(make_pair(x, c));
    }

}


s.insert(make_pair(0, ns));
while(s.empty()==false){
  nod=(*s.begin()).second;
  d=(*s.begin()).first;
  s.erase(*s.begin());
  if(v[nod].empty()==false){
    for(i=0;i<=v[nod].size()-1;i++){
        nodcurent=v[nod][i].first;
        distanta=v[nod][i].second;
        if(distgg[nodcurent]>d+distanta){
            if(distgg[nodcurent]!=2000000001)
                s.erase(s.find(make_pair(distgg[nodcurent], nodcurent)));
            distgg[nodcurent]=d+distanta;
            s.insert(make_pair(distgg[nodcurent], nodcurent));
        }
    }
  }
}
steag=0;
for(i=1;i<=n;i++){
    if(distdat[i]!=distgg[i])
        steag=1;
}
if(steag==0)
    fprintf(fout,"DA\n");
else
    fprintf(fout,"NU\n");


}
fclose(fin);
fclose(fout);
    return 0;
}