Cod sursa(job #425834)

Utilizator NemultumituMatei Ionita Nemultumitu Data 26 martie 2010 10:22:32
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
vector <pair<int,int> > andreea[50050];
int coada[1000000],d[50050],cost[50050];
bool v[50050],marc[50050];
int n,m,t,s;

void citire()
{
    scanf("%d%d%d",&n,&m,&s);
    for (int i=1;i<=n;++i)
        scanf("%d",&d[i]);
    int x,y,c;
    while (m--)
    {
        scanf("%d%d%d",&x,&y,&c);
        andreea[x].push_back(make_pair(y,c));
        andreea[y].push_back(make_pair(x,c));
    }
}


int main()
{
    freopen ("distante.in","r",stdin);
    freopen ("distante.out","w",stdout);
    scanf("%d",&t);
    while (t--)
    {
        citire();
        int r=1,p;
        coada[1]=s;
        memset(v,0,sizeof(v));
        memset(marc,0,sizeof(marc));
        memset(cost,0,sizeof(cost));
		marc[s]=1;
        v[s]=1;
        for (p=1;p<=r;++p)
        {
            int nod=coada[p%1000000];
            marc[nod]=0;
            for (int i=0;i!=andreea[nod].size();++i)
            {
                if (!v[andreea[nod][i].first]||andreea[nod][i].first!=s&&cost[andreea[nod][i].first]>cost[nod]+andreea[nod][i].second)
				{
					if (!marc[andreea[nod][i].first])
					{
						++r;
                        coada[r%1000000]=andreea[nod][i].first;
					}
					marc[andreea[nod][i].first]=1;
					cost[andreea[nod][i].first]=cost[nod]+andreea[nod][i].second;
					v[andreea[nod][i].first]=1;
				}
            }
        }
        bool k=1;
        for (int i=1;i<=n;++i)
            if (cost[i]!=d[i])
                k=0;
        if (k)
            printf("DA\n");
        else
            printf("NU\n");
    }
    return 0;
}