Cod sursa(job #1019734)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 31 octombrie 2013 20:59:01
Problema Distante Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
FILE * f;
int t,i;
int exist(int nod, vector <int> vmn, vector <pair <int,int> > vnod)
{
    int i;
    int s=vnod.size();
    for (i=0;i<s;i++)
        if (vmn[vnod[i].first]+vnod[i].second==vmn[nod])
            return 1;
    return 0;
}
int verify(int nod, vector <int> vmn, vector <pair <int,int> > vnod)
{
    int i;
    int s=vnod.size();
    for (i=0;i<s;i++)
        if (vmn[nod]+vnod[i].second<vmn[vnod[i].first])
            return 0;
    return 1;
}
int go()
{
    int n,m,s;
    fscanf(f,"%d%d%d",&n,&m,&s);
    int i,nr,a,b,c;
    vector <int> v;
    v.push_back(0);
    for (i=1;i<=n;i++)
    {
        fscanf(f,"%d",&nr);
        v.push_back(nr);
    }
    if (v[s]!=0)
        return 0;
    vector <pair <int, int> > nod[n+2];
    for (i=1;i<=m;i++)
    {
        fscanf(f,"%d%d%d",&a,&b,&c);
        nod[a].push_back(make_pair(b,c));
        nod[b].push_back(make_pair(a,c));
    }
    for (i=1;i<=n;i++)
        if (i!=s)
        {
            if (exist(i,v,nod[i])==0)
                return 0;
            if (verify(i,v,nod[i])==0)
                return 0;
        }
    return 1;
}
int main(void)
{
    f=fopen("distante.in","r");
    ofstream g("distante.out");
    fscanf(f,"%d",&t);
    for (i=1;i<=t;i++)
    {
        if (go()==1)
            g<<"DA\n";
        else
            g<<"NU\n";
    }
    g.close();
    return 0;
}