Cod sursa(job #1449994)

Utilizator Spam97Matache Dragos Spam97 Data 11 iunie 2015 09:41:26
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<iostream>
#include<fstream>
using namespace std;
#define Infinity 9999;
ifstream f("distante.in");
ofstream g("distante.out");
int nrg,n,m,sr,a[100][100],cost[100];
void dij(int x)
{    int viz[100],i,ok,mini,k;
    for(i=1;i<=n;i++)
    {
        viz[i]=0;
        cost[i]=a[x][i];
    }
    viz[x]=1;
    do{
        mini=Infinity;
        for(i=1;i<=n;i++)
        if(viz[i]==0 && cost[i]<mini)
        {
            mini=cost[i];
            k=i;
        }
        viz[k]=1;
        for(i=1;i<=n;i++)
            if(cost[i]>cost[k]+a[k][i] && viz[i]==0)
                cost[i]=cost[k]+a[k][i];
                ok=0;
                for(i=1;i<=n;i++)
                    if(viz[i]==0)
                    ok=1;}while(ok==1);
}
int main()
{ int ok,gr=1,i,cost1[100],x,y,c,j;
    f>>nrg;
    while(gr<=nrg)
    {
    f>>n>>m>>sr;
    ok=1;
    for(i=1;i<=n;i++)
        f>>cost1[i];
    for(i=1;i<=m;i++)
       {
        f>>x>>y>>c;
        a[x][y]=c;
        a[y][x]=c;
       }
       for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        if(a[i][j]==0 && i!=j)
        a[i][j]=Infinity;
       dij(sr);
       for(i=1;i<=n;i++)
        if(cost1[i]!=cost[i])
            ok=0;
       if(ok==0)
        g<<"NU"<<endl;
        else
        g<<"DA"<<endl;
       gr++;
    }
    return 0;
}