Pagini recente » Cod sursa (job #2761565) | Cod sursa (job #2705021) | Cod sursa (job #2175062) | Cod sursa (job #588925) | Cod sursa (job #3158257)
#include <fstream>
#include <set>
#include <vector>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int n,i,j,t,m,k,v[100005],x,y,c,d[50005];
const int INF=10000001;
set <pair<int,int>> q;
vector <pair<int,int>> l[50005];
void dijkstra(int nod, int cost)
{
while (!q.empty())
{
nod=q.begin()->second;
q.erase(q.begin());
for (int i=0;i<l[nod].size();i++)
{
int vec = l[nod][i].first;
int cost = l[nod][i].second;
if (d[vec]>d[nod]+cost)
{
q.erase(make_pair(d[vec],vec));
d[vec]=d[nod]+cost;
q.insert(make_pair(d[vec],vec));
}
}
}
}
int main()
{
fin >>t;
for (i=1;i<=t;i++)
{
fin >>n>>m>>k;
for (j=1;j<=n;j++)
{
fin >>v[j];
l[i].clear();
}
for (j=1;j<=m;j++)
{
fin >>x>>y>>c;
l[x].push_back(make_pair(y,c));
l[y].push_back(make_pair(x,c));
}
for (j=1;j<=n;j++)
{
d[j]=INF;
}
d[k]=0;
q.insert(make_pair(0,k));
dijkstra(0,k);
int ok=0;
for (j=1;j<=n;j++)
{
if (v[j]!=d[j]) {fout <<"NU"<<'\n'; ok=1;break;}
}
if (ok==0) fout <<"DA"<<'\n';
}
return 0;
}