Cod sursa(job #964490)

Utilizator alinaelenaFMI Colceag Alina alinaelena Data 21 iunie 2013 10:06:29
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include<cstdio>
#include<fstream>
#include<vector>
#include<queue>
 
#define INFINIT 1<<20
#define DIM 100001
 
using namespace std;
 
 
int dist[DIM];
bool in_queue[DIM];
int s;
int drum[DIM];
vector< pair<int,int> >graf[DIM];
 
int print (int start,int n)
{
    for(int i=1; i<=n; ++i)
    {
        if(dist[i] != drum[i])
            return 0;
    }
    return 1;
}
 
 
 
void bellford(int start , int n)
{
    int nod;
    queue <int> queue_graf;
    drum[start]=0;
    queue_graf.push(start);
    in_queue[start] = true;
 
    while(!queue_graf.empty())
    {
        nod=queue_graf.front();
        queue_graf.pop();
        in_queue[start] = false;
        for( int 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)
     {
        drum[i] = INFINIT;
        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,m;
    int t;
 
    scanf("%d",&t);
    for (int i=1; i<=t; ++i)
    {
 
        scanf("%d%d",&n,&m);
        scanf("%d",&s);
        reset(n);
 
        for (int i=1; i<=n; ++i)
            scanf("%d",&dist[i]);
 
        for(int j=1; j<=m; j++)
        {
            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);
    }
    return 0;
}