Cod sursa(job #1370565)

Utilizator Alex_dudeDudescu Alexandru Alex_dude Data 3 martie 2015 15:46:47
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.06 kb
#define Dudica "Dudescu Alexandru"
#include <cstdio>
#include <vector>
#include <utility>
#include <algorithm>
#define nmax 50005
#define inf 99999999
using namespace std;
FILE *f1=fopen("distante.in","r"),*f2=fopen("distante.out","w");
vector <pair<int,int> > g[nmax];

int N,M,n,nrTeste,s;
int dmin[nmax],heap[nmax],pozHeap[nmax];
int d[nmax];
vector <bool> rezTest;

// Functii heap
void update(int x)
{
    while(x>=1&&dmin[heap[x]]<dmin[heap[(x-1)/2]])
    {
        swap(pozHeap[heap[x]],pozHeap[heap[(x-1)/2]]);
        swap(heap[x],heap[(x-1)/2]);
        x=(x-1)/2;
    }
}
int getMin()
{
    int minim,i=0,fiu;
    minim=heap[0];
    n--;
    pozHeap[heap[0]]=pozHeap[heap[n]];
    heap[0]=heap[n];
    do
    {
        fiu=0;
        if(2*i+1<n)
        {
            fiu=2*i+1;
            if(2*i+2<n&&dmin[heap[2*i+2]]<dmin[heap[2*i+1]])
            fiu++;
            if(dmin[i]<=dmin[fiu])fiu=0;
        }
        if(fiu)
        {
            swap(pozHeap[heap[i]],pozHeap[heap[fiu]]);
            swap(heap[i],heap[fiu]);
            i=fiu;
        }
    }while(fiu);
    return minim;
}
// Functii graf
void dijkstra()
{
    int vfMin,i,j;
    for(j=1;j<=N;j++)
    {
        vfMin=getMin();
        for(i=0;i<g[vfMin].size();i++)
            if(dmin[g[vfMin][i].first]>dmin[vfMin]+g[vfMin][i].second)
            {
                dmin[g[vfMin][i].first]=dmin[vfMin]+g[vfMin][i].second;
                update(pozHeap[g[vfMin][i].first]);
            }
    }
}
void eraseGraf()
{
    int i;
    for(i=1;i<=N;i++)
    {
        d[i]=0;
        dmin[i]=0;
        heap[i-1]=0;
        pozHeap[i]=0;
        g[i].erase(g[i].begin(),g[i].end());
    }
}
int main()
{
    fscanf(f1,"%d",&nrTeste);
    int test,i,x,y,c;
    //Pentru fiecare test
    for(test=1;test<=nrTeste;test++)
    {
        //Citeste n m s
        fscanf(f1,"%d %d %d",&N,&M,&s);
        //Citeste vectorul de distante
        for(i=1;i<=N;i++)
        fscanf(f1,"%d",&d[i]);
        //Initializari
        for(i=1;i<=N;i++)
        {
            dmin[i]=inf;
            heap[i-1]=i;
            pozHeap[i]=i-1;
        }
        n=N;
        dmin[s]=0;
        update(pozHeap[s]);
        for(i=1;i<=M;i++)
        {
            fscanf(f1,"%d %d %d",&x,&y,&c);
            g[x].push_back(make_pair(y,c));
            g[y].push_back(make_pair(x,c));
            if(x==s)
            {
                dmin[y]=c;
                update(pozHeap[y]);
            }
            if(y==s)
            {
                dmin[x]=c;
                update(pozHeap[x]);
            }
        }
        dijkstra();
        bool ok=1;
        for(i=1;i<=N;i++)
        if(d[i]!=dmin[i]){ok=0;break;}
        rezTest.push_back(ok);
        eraseGraf();
    }
    for(i=0;i<rezTest.size();i++)
    if(rezTest[i])fprintf(f2,"DA\n");
    else fprintf(f2,"NU\n");
    fclose(f1);
    fclose(f2);
    return 0;
}

//Our greatest weakness lies in giving up. The most certain way to succeed is always to try just one more time.