Cod sursa(job #4209)

Utilizator gigi_becaliGigi Becali gigi_becali Data 1 ianuarie 2007 14:19:42
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.73 kb

#include <stdio.h>
#include <string>
#include <stdlib.h>
#define nil -1
#define oo 0x3f3f3f3f
#define maxn 50005
#include <deque>
#include <set>
#include <multiset.h>
#include <algorithm>
#define MAX_SIZE (10*(19+50000*10+1700019))
using namespace std;

struct nod { int x,w;};
struct dijkstra{ deque<nod>a;};
struct avl{ int d, v;};

bool operator < (const avl &a, const avl &b)
{
	if(a.d<b.d) return true;
	if(a.d==b.d) if(a.v<b.v) return true;
	return false;
}

multiset<avl> Q;
int d[maxn], pi[maxn];
int T;
dijkstra mat[maxn];
int n, m, i, j;
int v[maxn];
int sum, nr;
deque<nod>::iterator it;
int sol[maxn], p, qq;
int comp[maxn];
char cit[MAX_SIZE];

void initializeaza_sursa_unica(int s);
void relaxeaza(int u, int v, int w);
int extrage_min();
void dijkstra(int s);



void citire()
{
	int p, q, w;
	FILE*f=fopen("distante.in", "r");

      
	fread(cit, sizeof(char),MAX_SIZE , f);
	nod aux;
	char *o;
	o=strtok(cit, " \n");
	T=atoi(o);
	//printf("%d\n", T);
       
	int k;
	n=maxn-1;
	for(k=1;k<=T;k++)
	  {

	   
	    	    for(i=1;i<=n;i++) mat[i].a.clear();
	    
	    
	    o=strtok(NULL, " ");    
	    n=atoi(o);
	    o=strtok(NULL, " ");
	    m=atoi(o);
	    o=strtok(NULL, " \n");
	    qq=atoi(o);

	   
	      
	    for(i=1;i<=n;i++) 
	      {
		o=strtok(NULL, " \n");
		comp[i]=atoi(o);
	      }


	    o=strtok(NULL, " ");    
	    p=atoi(o);
	    o=strtok(NULL, " ");
	    q=atoi(o);
	    o=strtok(NULL, " \n");
	    w=atoi(o);
	   
	    aux.x=q;
	    aux.w=w;
	    mat[p].a.push_back(aux);
	    aux.x=p;
	    aux.w=w;
	    mat[q].a.push_back(aux);

	
	for(i=2;i<=m;i++) 
	  {
	    o=strtok(NULL, " ");
	    p=atoi(o);
	    o=strtok(NULL,  " ");
	    q=atoi(o);
	    o=strtok(NULL, " \n");
	    w=atoi(o);
	    aux.x=q;
	    aux.w=w;
	    mat[p].a.push_back(aux);
	    aux.x=p;
	    aux.w=w;
	    mat[q].a.push_back(aux);
	}
	    
		dijkstra(qq);
		int ok=1, i;
		for(i=1;i<=n && ok;i++) if(comp[i]!=d[i]) ok=0;
		if(ok) printf("DA\n");
		else printf("NU\n");
	  }
	fclose(f);
     
}

void initializeaza_sursa_unica(int s)
{
	avl aux;
	for(int i=1;i<=n;i++)
		if(i!=s)
		{
			aux.v=i;
			aux.d=oo;
			Q.insert(aux);
		}
	
	memset(d, oo, sizeof(d));
	memset(pi, nil, sizeof(pi));
	d[s]=0;
	aux.d=0;
	aux.v=s;
	Q.insert(aux);
}

inline void relaxeaza(int u, int v, int w)
{
	if(d[v]>d[u]+w)
	{	avl aux;
		aux.d=d[v];
		aux.v=v;
		Q.erase(aux);
		aux.d=d[u]+w;
		Q.insert(aux);
		d[v]=d[u]+w;
		pi[v]=u;
	}
}

inline int extrage_min()
{
	int x=Q.begin()->v;
	Q.erase(Q.begin());
	return x;
}


void dijkstra(int s)
{
	initializeaza_sursa_unica(s);
	int u;
	while(Q.size())
	{
		u=extrage_min();
		
		for(it=mat[u].a.begin();it!=mat[u].a.end();++it)
			relaxeaza(u, it->x, it->w);
	}
}

int main()
{

    freopen("distante.out", "w", stdout);
	citire();
	
      
	return 0;
}