Pagini recente » Cod sursa (job #1304392) | Cod sursa (job #411644) | Cod sursa (job #1525309) | Cod sursa (job #1959441) | Cod sursa (job #1833316)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int N_max=100001;
char s[200];
int v[N_max],dist[N_max];
bool adevarat=1;
struct poz
{
int nod,lungime;
};
struct poz1
{
int nod1,cost1;
poz1 *urm;
}*muchii[N_max];
struct cmp
{
bool operator () (const poz &a,const poz &b)
{
return a.lungime>b.lungime;
}
};
priority_queue < poz , vector <poz> , cmp > pq;
void adauga(int a,int b,int c)
{
poz1 *p;
p=new poz1;
p->nod1=b;
p->cost1=c;
if (muchii[a]==NULL)
p->urm=NULL, muchii[a]=p;
else p->urm=muchii[a], muchii[a]=p;
}
void sterge(int a,int b)
{
poz1 *p,*p1;
p=muchii[a];
p1=muchii[a]->urm;
if (p->nod1==b)
{
muchii[a]=p1;
delete p;
}
else while (p1)
{
if (p1->nod1==b)
{
p->urm=p1->urm;
delete p1;
break;
}
else p=p->urm, p1=p1->urm;
}
}
void adauga_in_heap(int a,int b)
{
poz1 *p,*p1;
p=muchii[a];
if (p!=0)
{
p1=muchii[a]->urm;
while (p1)
{
if (dist[p->nod1]==-1)
{
dist[p->nod1]=p->cost1+b;
pq.push({p->nod1,p->cost1+b});
}
sterge(p->nod1,a);
delete p;
p=p1;
p1=p1->urm;
}
if (dist[p->nod1]==-1)
{
dist[p->nod1]=p->cost1+b;
pq.push({p->nod1,p->cost1+b});
sterge(p->nod1,a);
delete p;
}
}
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int T;
scanf("%d\n",&T);
for (int k=1;k<=T;k++)
{
int n=0,m=0,S=0;
char op=0;
gets(s);
adevarat=1;
for (int i=0;s[i]!=0;i++)
{
if (s[i]==' ') op++;
else
if (op==0) n=n*10+s[i]-'0';
else if (op==1) m=m*10+s[i]-'0';
else if (op==2) S=S*10+s[i]-'0';
}
gets(s);
op=1;
v[1]=0;
for (int i=0;s[i]!=0;i++)
{
if (s[i]==' ') op++, v[op]=0;
else v[op]=v[op]*10+s[i]-'0';
if (i>0 && i<n+1 && i!=S)
dist[i]=-1;
else if (i==S) dist[S]=0;
}
for (int i=1;i<=m;i++)
{
int a=0,b=0,c=0;
gets(s);
op=1;
for (int j=0;s[j]!=0;j++)
{
if (s[j]==' ') op++;
else if (op==1) a=a*10+s[j]-'0';
else if (op==2) b=b*10+s[j]-'0';
else if (op==3) c=c*10+s[j]-'0';
}
adauga(a,b,c);
adauga(b,a,c);
}
if (v[S]==0)
{
adauga_in_heap(S,0);
while (!pq.empty())
{
poz op1=pq.top();
pq.pop();
if (op1.lungime != v[op1.nod])
{
adevarat=0;
while (!pq.empty()) pq.pop();
}
else
adauga_in_heap(op1.nod,op1.lungime);
}
for (int i=1;i<=n;i++)
{
/**poz1 *p,*p1;
p=muchii[i];
p1=muchii[i]->urm;
while (p1)
{
sterge(i,p->nod1);
sterge(p->nod1,i);
p=p1;
p1=p1->urm;
}
sterge(i,p->nod1);
sterge(p->nod1,i);*/
muchii[i]=NULL;
}
}
else adevarat=0;
if (adevarat==1) printf("DA\n");
else printf("NU\n");
}
}