Cod sursa(job #953068)

Utilizator primulDarie Sergiu primul Data 24 mai 2013 18:44:12
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
# include <algorithm>
#define infinit 2000000000
#define lmax 60000
# define verf ++poz == hg ? f.read (ch, hg), poz = 0 : 0
 
using namespace std;
 
const char *FIN = "distante.in", *FOU = "distante.out";
const int MAX = 500001, hg = 1 << 13;
 
ifstream f (FIN);
ofstream g (FOU);
char ch[hg];
int poz;
 
void cit ( int &x ) {
    if (ch[0] == '\0') f.read (ch, hg) ;
    else for (; ch[poz] < '0' || ch[poz] > '9' ; verf) ;
    for (x = 0 ; ch[poz] >= '0' && ch[poz] <= '9' ; x = x * 10 + ch[poz] - '0', verf) ;
}
 
struct muchie
{
    int inf;
    int cost;
}y;
 
vector <muchie>v[lmax];
int d[lmax];
int coada[lmax];
int s,n;
 
void bf()
{
    int prim,ultim,i,j,x,y;
    ultim=1;
    prim=1;
    coada[1]=s;
 
    for(i=1;i<=n;i++)
    {
        d[i]=infinit;
    }
    d[s]=0;
 
    while(prim<=ultim)
    {
        x=coada[prim++];
        for(i=0;i<v[x].size();i++)
        {
            if(d[v[x][i].inf]>d[x]+v[x][i].cost)
            {
                coada[++ultim]=v[x][i].inf;
                d[v[x][i].inf]=d[x]+v[x][i].cost;
            }
        }
    }
}
int main()
{
    int i,m,t,d1[lmax],a,ok;
 
    cit (t);
 
    while(t--)
    {
        cit (n);
        cit (m);
        cit (s);
        for(i=1;i<=n;i++)
            {
                cit(d1[i]);
            }
        for(i=1;i<=n;i++)
        {
            v[i].erase(v[i].begin(),v[i].begin()+v[i].size());
        }
        for(int aux,i=1;i<=m;i++)
        {
            cit(a);
            cit(y.inf);
            cit(y.cost);
            v[a].push_back(y);
            aux=a;
            a=y.inf;
            y.inf=aux;
            v[a].push_back(y);
        }
 
        if(d1[s]==0)
        {
            bf();
            ok=1;
            for(i=1;i<=n;i++)
            {
                if(d1[i]!=d[i])
                {
                    g<<"NU"<<"\n";
                    i=n;
                    ok=0;
                }
            }
            if(ok==1)
            {
                g<<"DA"<<"\n";
            }
        }
        else
        {
            g<<"NU\n";
        }
    }
 
}