Pagini recente » Cod sursa (job #816997) | Cod sursa (job #616975) | Cod sursa (job #2748138) | Cod sursa (job #664373) | Cod sursa (job #2655595)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define l long
#define d double
#define in int
#define fo(i, n) for (i = 0; i < n; i++)
#define si(x) scanf('%d', &x)
#define sl(x) scanf('%lld', &x)
#define ss(s) scanf('%s', s)
#define pi(x) printf('%d', x)
#define pl(x) printf('%lld', x)
#define ps(s) printf('%s', s)
#define pb push_back
#define mp make_pair
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define clr(x) memset(x, 0, sizeof(x))
#define sortall(x) sort(all(x))
typedef pair<int, int> pii;
typedef pair<ll, ll> pl;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpii;
#define INF 1000000000
#define NMAX 200001
string file = "distante";
//ifstream fin("citire.in");
ifstream fin(file+".in");
ofstream fout(file+".out");
vector<pair<int,int>> graf[NMAX];
vector<int>drum;
int n,m,s;
void dijkstra(int start_node)
{
int distance[NMAX],i,j;
int visited[NMAX];
for(i=1;i<=n;i++)
{
visited[i] = 0;
distance[i] = INF;
}
vector<pair<int,int>> ::iterator it;
for(it = graf[start_node].begin(); it != graf[start_node].end(); ++it)
{
distance[it->first] = it->second;
}
visited[start_node] = 1;
distance[start_node] = 0;
int min,pmin = 0;
for(i=1;i<=n-1;i++)
{
min = INF;
for(j=1;j<=n;j++)
{
if(distance[j] < min && !visited[j])
{
min = distance[j];
pmin = j;
}
visited[pmin] = 1;
for(it = graf[pmin].begin(); it != graf[pmin].end(); ++it)
{
if(distance[it->first] > distance[pmin] + it->second)
{
distance[it->first] = distance[pmin] + it->second;
}
}
}
}
bool ok = true;
for(i=1;i<=n && ok == true;i++)
{
if(distance[i] != drum[i])
ok = false;
}
if(ok == true)
{
fout<<"DA";
}
else fout<<"NU";
fout<<'\n';
}
void solve()
{
fin>>n>>m>>s;
int i,x,y,c;
for(i=1;i<=n;i++)
{
drum.push_back(0);
}
for(i=1;i<=n;i++)
{
fin>>x;
drum[i] = x;
}
for(i=1;i<=m;i++)
{
fin>>x>>y>>c;
graf[x].push_back(make_pair(y,c));
graf[y].push_back(make_pair(x,c));
}
dijkstra(s);
}
int main()
{
unsigned T;
fin>>T;
while(T)
{
solve();
T--;
}
fin.close();
fout.close();
return 0;
}