Cod sursa(job #1901097)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 3 martie 2017 18:57:30
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
int t,n,m,s,x,a,b,i,ok,u,v[50005],r[50005],d[50005];
vector <int> w[11][50005];
vector <int> c[11][50005];
queue <int> q;
int main()
{
    FILE *f=fopen("distante.in","r");
    FILE *g=fopen("distante.out","w");
    fscanf(f,"%d",&t);
    u=0;
    while(u<t)
    {
        u++;
        fscanf(f,"%d%d%d",&n,&m,&s);
        for(i=1; i<=n; i++)
        {
            fscanf(f,"%d",&v[i]);
            d[i]=1;
            w[u][i].push_back(0);
            c[u][i].push_back(0);
            r[i]=100000005;
        }
        for(i=1; i<=m; i++)
        {
            fscanf(f,"%d%d%d",&a,&b,&x);
            w[u][a][0]++;
            w[u][a].push_back(b);
            c[u][a].push_back(x);
            w[u][b][0]++;
            w[u][b].push_back(a);
            c[u][b].push_back(x);
        }
        q.push(s);
        d[s]=0;
        r[s]=0;
        ok=1;
        while(!q.empty()/*&&ok*/)
        {
            x=q.front();
            q.pop();
            if(d[x]==0)
            {
                d[x]=1;
                for(i=1; i<=w[u][x][0]; i++)
                {
                    if(r[w[u][x][i]]>r[x]+c[u][x][i])
                    {
                        r[w[u][x][i]]=r[x]+c[u][x][i];
                        //if(v[w[u][x][i]]>r[w[u][x][i]]) ok=0;
                        d[w[u][x][i]]=0;
                        q.push(w[u][x][i]);
                    }
                }
            }
        }
        for(i=1; i<=n&&ok; i++) if(r[i]!=v[i]) ok=0;
        if(ok) fprintf(g,"DA\n");
        else fprintf(g,"NU\n");
    }
    fclose(f); fclose(g);
    return 0;
}