Pagini recente » Borderou de evaluare (job #420512) | Cod sursa (job #3244464) | Cod sursa (job #1254340) | Cod sursa (job #1349846) | Cod sursa (job #1835114)
#include <fstream>
#include <vector>
#include <queue>
#define inf 2000000000
using namespace std;
ifstream in ("distante.in");
ofstream out ("distante.out");
int dist[50050];
class priority
{
public:
bool operator () (int &x,int &y)
{
return dist[x]>dist[y];
}
};
void dijkstra()
{
vector< vector< pair<int,int> > >g(50050);
priority_queue<int, vector<int>, priority>pq;
int v[50050];
bool viz[50050];
int n,m,start,x,y,c,node,i,j=0;
in>>n>>m>>start;
for(i=1; i<=n; i++)
{
in>>v[i];
dist[i]=inf;
viz[i]=false;
}
for(i=1; i<=m; i++)
{
in>>x>>y>>c;
g[x].push_back(make_pair(y,c));
g[y].push_back(make_pair(x,c));
}
dist[start]=0;
pq.push(start);
while(!pq.empty() && j!=n)
{
node=pq.top();
pq.pop();
if(viz[node]==false)
{
j++;
viz[node]=true;
for(i=0; i<g[node].size(); i++)
{
if(dist[node]+g[node][i].second<dist[g[node][i].first])
{
dist[g[node][i].first]=dist[node]+g[node][i].second;
pq.push(g[node][i].first);
}
}
}
}
for(i=1; i<=n; i++)
{
if(dist[i]!=v[i])
{
out<<"NU"<<endl;
return;
}
}
out<<"DA"<<endl;
}
int main()
{
int t,i;
in>>t;
for(i=1; i<=t; i++)
dijkstra();
return 0;
}