Pagini recente » Cod sursa (job #8761) | Cod sursa (job #2268150) | Cod sursa (job #69931) | Cod sursa (job #3207526) | Cod sursa (job #1370565)
#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.