Cod sursa(job #1642314)

Utilizator dyianTorok Tibor-Daniel dyian Data 9 martie 2016 13:33:09
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include<iostream>
#include<fstream>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");

//n - numarul de linii
//m - numarul de coloane
//T - numarul de grafuri
//c - costul de la x la y

int d[10000];
int T,da;


struct mat{
    long v[1000][1000];
    long dis[10000];
    long n,m,S;
}a[11];

void cit()
{
    f>>T;
    int x,y,z;
    for(int k=1;k<=T;k++)
    {
        f>>a[k].n>>a[k].m>>a[k].S;
        for(int i=1;i<=a[k].n;i++)
            f>>a[k].dis[i];

        for(int i=1;i<=a[k].m;i++)
        {
            f>>x>>y>>z;
            a[k].v[x][y]=z;
        }

        for(int c=1;c<=a[k].n;c++)
            for(int l=1;l<=a[k].n;l++)
                if(l==c) a[k].v[c][l]== 0;
                    else if(a[k].v[c][l]==0) a[k].v[c][l]=10000;

    }
}

void dijkstra (int xo,int l)
{
    int t[1000],v[1000],ok,mn,k;
    for(int i=1;i<=a[l].n;i++)
    {
        v[i]=0;
        t[i]=xo;
        d[i]=a[l].v[xo][i];
    }
    ok = 1;
    v[xo] = 1;
    t[xo] = 0;
    while(ok==1)
    {
        mn = 10000;
        for(int i=1;i<=a[l].n;i++)
            if(v[i]==0 and mn > d[i])
            {
                mn = d[i];
                k = i;
            }
        if(mn!=10000)
        {
            v[k]=1;
            for(int i=1;i<=a[l].n;i++)
            if (v[i] == 0 && d[i] > d[k] + a[l].v[k][i])
            {
                d[i] = d[k] + a[l].v[k][i];
                t[i] = k;
            }
        }
        else ok = 0;
    }
}

int main()
{
    cit();

    for(int i=1;i<=T;i++)
    {
        da=0;
        dijkstra(a[i].S,i);
        for(int j=1;j<=a[i].n and da==0;j++)
            if(a[i].dis[j]!=d[j]) {g<<"NU"<<endl;da=1;}
        if(da==0) g<<"DA"<<endl;
    }
}