Cod sursa(job #964497)

Utilizator UnforgivenMihai Catalin Botezatu Unforgiven Data 21 iunie 2013 10:29:08
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include<cstdio>
#include<fstream>
#include<vector>
#include<queue>

using namespace std;

const static int DIM = 50101;
const static int INFINIT = 1 << 20;

int dist[DIM];
bool in_queue[DIM];
int s;
int drum[DIM];
vector< pair<int,int> >graf[DIM];

int print (int start,int n)
{
    drum[start] = 0;
    for(int i=1; i<=n; ++i)
    {
        if(dist[i] != drum[i])
            return 0;
    }
    return 1;
}



void bellford(int start , int n)
{
    int nod , i;
    queue <int> queue_graf;
    fill(drum + 1,drum + n + 1, INFINIT);
    fill(in_queue +1 , in_queue+n + 1 , false);
    drum[start]=0;
    queue_graf.push(start);
    in_queue[start] = true;

    while(!queue_graf.empty())
    {
        nod=queue_graf.front();
        queue_graf.pop();
        in_queue[nod] = false;
        for( i=0; i<graf[nod].size(); ++i )
        {
            if(drum[nod]+graf[nod][i].second<drum[graf[nod][i].first])
            {
                drum[graf[nod][i].first] = drum[nod]+graf[nod][i].second;
                if (!in_queue[nod])
                {
                    queue_graf.push(graf[nod][i].first);
                    in_queue[nod] = true;
                }
            }

        }
    }
    if(print(start,n)) printf("DA\n");
    else
        printf("NU\n");

}


void reset(int n)
{
     for(int i=1; i<=n; ++i)
     {
        dist[i] = 0;
        in_queue[i] = false;
        graf[i].clear();
     }
}
int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    int A,B,C,n = 0,m;
    int t;

    scanf("%d",&t);

    int cnt = 0, i = 0;

    for (cnt=1; cnt<=t; ++cnt)
    {
        scanf("%d%d",&n,&m);
        scanf("%d",&s);

        for (i=1; i<=n; ++i)
            scanf("%d",&dist[i]);

        for (i=1; i<=m; ++i)
        {
            scanf("%d %d %d",&A,&B,&C);
            graf[A].push_back(make_pair(B, C));
            graf[B].push_back(make_pair(A, C));
        }
        bellford(s,n);
        reset(n);
    }
    return 0;
}