Cod sursa(job #1603462)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 17 februarie 2016 16:12:42
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
FILE *f1=fopen("distante.in","r");
FILE *f2=fopen("distante.out","w");
int n,m,t,s,verf[50001],d[50001];
class comp{
   public:
       bool operator() (const int&a,const int&b){
            return d[a]>d[b];
       }
};
priority_queue<int,vector<int>,comp>Q;
struct nod{
   int inf,drum;
   nod *urm;
}*L[50001];
void adaugaresf(int val,int cost,nod *&vf){
   nod *q;
   q=new nod;
   q->inf=val;
   q->drum=cost;
   q->urm=vf;
   vf=q;
}
void dijkstra(int r){
    int x;
    nod *q;
    d[r]=0;
    Q.push(r);
    while(!Q.empty()){
        x=Q.top();
        Q.pop();
        q=L[x];
        while(q!=0){
            if (d[q->inf]>d[x]+q->drum){
                d[q->inf]=d[x]+q->drum;
                Q.push(q->inf);
            }
            q=q->urm;
        }
    }
}
void rezolva(){
    fscanf(f1,"%d%d%d",&n,&m,&s);
    int i,j,k,a,b,c,sw=1;
    for (i=1;i<=n;i++)
        fscanf(f1,"%d",&verf[i]);
    for (i=1;i<=n;i++)
        L[i]=0;
    for (k=1;k<=m;k++){
        fscanf(f1,"%d%d%d",&a,&b,&c);
        adaugaresf(a,c,L[b]);
        adaugaresf(b,c,L[a]);
    }
    for (i=1;i<=n;i++)
        d[i]=1000000;
    dijkstra(s);
    for (i=1;i<=n;i++)
      if (d[i]!=verf[i]) {
         sw=0;
         break;
      }
    if (sw==1) fprintf(f2,"DA\n");
       else
            fprintf(f2,"NU\n");
}
int main(){
    fscanf(f1,"%d",&t);
    int i;
    for (i=1;i<=t;i++){
        rezolva();
    }
    fclose(f1);
    fclose(f2);
    return 0;
}