Pagini recente » Istoria paginii runda/simulareoji_2010_11-12_miercuri/clasament | Cod sursa (job #1784793) | Cod sursa (job #1233518) | Cod sursa (job #1888885) | Cod sursa (job #1282791)
#include <fstream>
#include <vector>
#include <queue>
#include <limits>
using namespace std;
ifstream cin("dijkstra.in");
ofstream cout("dijkstra.out");
vector< vector< pair<int,int> > > a;
vector<int> d;
vector<bool> u;
queue<int> q;
int n,m,dd[50001];
bool dijkstra(int x)
{
int k;
d[x]=0;
u[x]=true;
q.push(x);
while(!q.empty())
{
k=q.front();q.pop();
u[k]=false;
for(vector< pair<int,int> >::iterator i=a[k].begin();i!=a[k].end();i++)
if(d[k]+i->second < d[i->first])
{
d[i->first]=d[k]+i->second;
if(u[i->first]==false)
{
q.push(i->first);
u[i->first]=true;
}
}
}
for(int i=1;i<=n;i++)
if(d[i]!=dd[i])
return false;
return true;
}
int main()
{
int x,y,z,i,t,st;
for(cin>>t;t;t--)
{
cin>>n>>m>>st;
a=vector< vector< pair<int,int> > >(n+1);
d=vector<int>(n+1,numeric_limits<int>::max());
u=vector<bool>(n+1);
for(i=1;i<=n;i++)cin>>dd[i];
for(;m;m--)
{
cin>>x>>y>>z;
a[x].push_back(make_pair(y,z));
a[y].push_back(make_pair(x,z));
}
if(dijkstra(st))cout<<"DA"<<'\n';
else cout<<"NU"<<'\n';
}
return 0;
}