Pagini recente » Cod sursa (job #2587250) | Arhiva de probleme | Rating Rusu Radu (rusuradu12) | Cod sursa (job #2001078) | Cod sursa (job #723664)
Cod sursa(job #723664)
#include<cstdio>
#include<climits>
#define MAX 100005
#define MAX2 50005
#define inf INT_MAX
int X[MAX],Y[MAX],C[MAX];
int D[MAX2],F[MAX2],T[MAX2];
int Sol[MAX2];
int m,n,start;
int t;
void read(){
freopen("dijkstra.in","r",stdin);
scanf("%d%d",&n,&m,&start);
int nod_pornire = start;
for(int i=1;i<=n;i++)
scanf("%d",&Sol[i]);
/* Setez toate distantele din D cu inf */
for(int i=1;i<=n;i++)
if(i!=nod_pornire)
D[i]=inf;
/* Am trecut prin nodul de pornire (1) */
F[nod_pornire]++;
/* Read si initializez D pentru nodul de plecare (1) */
for(int i=1;i<=m;i++){
scanf("%d%d%d",&X[i],&Y[i],&C[i]);
if(X[i]==nod_pornire){
D[Y[i]]=C[i];
T[Y[i]]=nod_pornire;
}
}
fclose(stdin);
}
void min_dist(int &min,int &poz){
min=inf;
for(int i=1;i<=n;i++){
if(min>D[i] && !F[i]){
min=D[i];
poz=i;
}
}
}
void dijkstra(){
for(int i=1;i<n;i++){
/* Caut distanta minima din D si retin si pozitia acestuia si selecez nodul poz*/
int min,poz;
min_dist(min,poz);
F[poz]++;
/* Verific daca prin nodul poz nu gasesc un drum mai scurt catre celelalte noduri */
for(int j=1;j<=m;j++)
if(X[j]==poz && !F[Y[j]]) // Verific daca X este nodul de care am nevoie
if(min+C[j]<D[Y[j]]){
D[Y[j]]=min+C[j];
T[Y[j]]=poz;
}
}
}
void solve(){
int i;
D[start] = 0;
for(i=1;i<=n;i++){
if(D[i]>=inf) D[i] = 0;
if(D[i]!=Sol[i]){
printf("NU\n");
break;
}
}
if(i>n) printf("DA\n");
}
int main(){
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&t);
for(int i=1;i<=t;i++){
read();
dijkstra();
solve();
}
return 0;
}