Cod sursa(job #1604079)

Utilizator andrei1230Tudorache Andrei andrei1230 Data 17 februarie 2016 22:28:51
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <iostream>
#include <fstream>
#include <cstring>

#define inf 10000

using namespace std;
ifstream f ("distante.in");
ofstream g ("distante.out");
int a[100][100], din[100], d[100], t[100], v[100], n, m, st;

int check()
{
for(int i=1;i<=n;i++)
    if(d[i]!=din[i]) return 0;
return 1;
}

void citire ()
{
f>>n>>m>>st;
for(int i=1;i<=n;i++)
    f>>din[i];
for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    if(i==j) a[i][j]=0;
    else a[i][j]=inf;
int x, y, z;
for(int i=1;i<=m;i++)
{
    f>>x>>y>>z;
    a[x][y]=a[y][x]=z;
}
}

void dij (int x)
{
int minn, k, ok=1;
memset(d,inf,400);
for(int i=1;i<=n;i++)
    {
    d[i]=a[x][i];
    if(d[i]<inf and d[i]<0)
        t[i]=x;
    }
v[x]=0;
t[x]=0;

while(ok)
{
    minn=inf;
    for(int i=1;i<=n;i++)
        if(v[i]==0 and d[i]<minn)
        {
            minn=d[i];
            v[i]=1;
            k=i;
        }
    if(minn==inf)
        ok=0;
    else
{

    v[k]=1;
for(int i=1;i<=n;i++)
    if(v[i]==0 && d[i]>d[k]+a[k][i])
{
    d[i]=d[k]+a[k][i];
    t[i]=k;
}

}
}

}


int main()
{
int cate;
f>>cate;

for(int i=1;i<=cate;i++)
{
    citire();
    dij(st);
    if(check()) g<<"DA\n";
    else g<<"NU\n";


}

return 0;

}