Pagini recente » Cod sursa (job #1159603) | Cod sursa (job #2240325) | Cod sursa (job #358031) | Cod sursa (job #2079905) | Cod sursa (job #787223)
Cod sursa(job #787223)
//Sursa ciordita ca sa verific limita de timp
#include <fstream>
#include <vector>
#include <set>
#include <algorithm>
#include <cstring>
#define MAX 50005
#define INF 0x3f3f3f3f
using namespace std;
vector< pair < int , int > > v[MAX];
int dist[MAX], dmin[MAX], t, n, m, s, a, b, c;
int main()
{
ifstream in("distante.in"); ofstream out("distante.out");
in>>t;
while(t--)
{
set< pair < int , int > > st;
memset(dist, INF, sizeof(dist));
in>>n>>m>>s; st.insert(make_pair(0, s)); dist[s] = 0;
for(int i = 1; i <= n; i++)
{
in>>dmin[i];
v[i].clear();
}
for(int i = 1; i <= m; i++)
{
in>>a>>b>>c;
v[a].push_back(make_pair(b, c));
v[b].push_back(make_pair(a, c));
}
while(!st.empty())
{
int val = (*st.begin()).first, nod = (*st.begin()).second;
st.erase(st.begin());
for(int i = 0; i < v[nod].size(); i++)
{
if(dist[v[nod][i].first] > v[nod][i].second + val)
{
dist[v[nod][i].first] = v[nod][i].second + val;
st.insert(make_pair(dist[v[nod][i].first], v[nod][i].first));
}
}
}
int sw = 0;
for(int i = 1; i <= n && !sw; i++)
if(dmin[i] != dist[i]) sw = 1;
if(!sw) out<<"DA\n";
else out<<"NU\n";
}
return 0;
}