Cod sursa(job #315173)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 14 mai 2009 18:02:59
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.65 kb
#include<algorithm>
using namespace std;
//#include<stdio.h>

#define DIM 1<<16
#define INF 1<<30
//#define DIM 501
//#define INF 1001

struct djk{
    int poz,val;};

struct graf{
    int nod,cost;
    graf *urm;};

int t,n,m,s,cnt,b[DIM],h[DIM];
djk a[DIM];
graf *lst[DIM];

int check(){
    int i;

    for(i=1; i<=n; ++i)
        if(a[i].val!=b[i])
            return 0;
    return 1;}

void add(int x,int y,int cost){
    graf *p=new graf;

    p->nod=y;
    p->cost=cost;
    p->urm=lst[x];
    lst[x]=p;}

void init(){
	int i;
	graf *p,*q;

	for(i=1; i<=n; ++i){
		for(p=lst[i]; p; p=q){
			q=p->urm;
			delete p;}
		lst[i]=NULL;
		a[i].poz=a[i].val=0;}}

void swap(int x,int y){
    int aux;

    aux=h[x];
    h[x]=h[y];
    h[y]=aux;}

void uph(int k){
    int aux;

    while(k>1){
        aux=k>>1;
        if(a[h[aux]].val>a[h[k]].val){
            a[h[k]].poz=aux;
            a[h[aux]].poz=k;
            swap(k,aux);
            k=aux;}
        else
            return;}}

void downh(int k){
    int aux;

    while(k<=cnt){
        if(k<<1<=cnt){
            aux=k<<1;
            if(aux+1<=cnt&&a[h[aux+1]].val<a[h[aux]].val)
                ++aux;}
        else
            return;
        if(a[h[aux]].val<a[h[k]].val){
            a[h[k]].poz=aux;
            a[h[aux]].poz=k;
            swap(k,aux);
            k=aux;}
        else
            return;}}

void insert(int k){

    h[++cnt]=k;
    a[h[cnt]].poz=cnt;
    uph(cnt);}

void cut(){

    h[1]=h[cnt--];
    a[h[1]].poz=1;
    downh(1);}

void dijkstra(){
    int aux;
    graf *p;

	h[++cnt]=s;
    a[h[cnt]].poz=1;
    while(cnt){
        aux=h[1];
        cut();
        for(p=lst[aux]; p; p=p->urm)
            if(a[aux].val+p->cost<a[p->nod].val){
                a[p->nod].val=a[aux].val+p->cost;
                if(a[p->nod].poz)
					uph(a[p->nod].poz);
				else
					insert(p->nod);}}}

void solve(){
    int i;

    cnt=0;
    for(i=1; i<=n; ++i)
        if(i!=s)
            a[i].val=INF;
    dijkstra();
    for(i=1; i<=n; ++i)
        if(a[i].val==INF)
            a[i].val=0;
    if(check())
        printf("DA\n");
    else
        printf("NU\n");}

void read(){
    int i,j,x,y,cost;

    scanf("%d",&t);
    for(i=0; i<t; ++i){
		scanf("%d%d%d",&n,&m,&s);
        for(j=1; j<=n; ++j)
            scanf("%d",&b[j]);
        for(j=0; j<m; ++j){
            scanf("%d%d%d",&x,&y,&cost);
            add(x,y,cost);}
        solve();
        init();}}

int main(){

    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);

    read();
    return 0;}