Cod sursa(job #1076470)

Utilizator MarghescuGabriel Marghescu Marghescu Data 10 ianuarie 2014 11:58:51
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include<fstream>
#include<cstring>
#include<list>
#define usi int
#define inf 1000000000L
#define nmax 50010
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int d[nmax],m,v[nmax];
usi n;

struct nod{
    usi x;
    usi cost;
    nod *urm;
};
nod *lista[nmax];

void adaug(usi a,usi b,usi c)
{
    nod *p;
    p=new nod;
    p->x=b;
    p->cost=c;
    p->urm=lista[a];
    lista[a]=p;
}

void dijkstra(usi vf)
{
    int vmin;
    char viz[nmax];
    nod *p;
    usi t[nmax],poz,i,j;
    for(i=1;i<=n;i++)
    {
        d[i]=inf;
        viz[i]=0;
    }
    d[vf]=0;
    t[vf]=0;

    for(i=1;i<=n;i++)
    {
        vmin=inf;
        for(j=1;j<=n;j++)
        {
            if(viz[j]==0 && d[j]<vmin)
            {
                vmin=d[j];
                poz=j;
            }
        }
        if(vmin==inf)
            break;
        viz[poz]=1;
        for(p=lista[poz];p!=NULL;p=p->urm)
        {
            if(d[p->x]>d[poz]+p->cost)
            {
                d[p->x]=d[poz]+p->cost;
                t[p->x]=poz;
            }
        }
    }
    int ok=1;
    for(i=1;i<=n;i++)
    {
        if(i!=vf)
        {
            if(d[i]==inf)
                d[i]=0;
            if(d[i]!=v[i])
                ok=0;
        }
    }
    if(ok)
        g<<"DA\n";
    else
        g<<"NU\n";
    p=new nod;
}
int main()
{
    int t;
    f>>t;
    for(int i=1;i<=t;i++)
    {
        memset(v,0,sizeof(v));
        int s;
       f>>n>>m>>s;
       for(int i=1;i<=n;i++)
            f>>v[i];
        for(int i=1;i<=m;i++)
        {
            usi x,y,z;
            f>>x>>y>>z;
            adaug(x,y,z);
        }
        dijkstra(s);
    }

    f.close();
    g.close();
    return 0;
}