Cod sursa(job #2133983)
Utilizator | Data | 17 februarie 2018 15:14:17 | |
---|---|---|---|
Problema | Distante | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 2.69 kb |
#include <bits/stdc++.h>
#define dim 50005
#define oo 1000000000
std::ifstream in("distante.in");
std::ofstream out("distante.out");
using namespace std;
bool FS();
int T,n,m;
vector< pair<int,int> >G[dim];
int ver[dim];
int D[dim];
bool viz[dim];
struct cmp
{
bool operator()(int x,int y)
{
return D[x]>D[y];
}
};
priority_queue< int , vector<int>, cmp>q;
void diji(int nod)
{
viz[nod]=true;
for(int i = 1; i<=n ;++i)
if(i!=nod)D[i]=oo;
else D[i]=0;
q.push(nod);
while(q.empty()==false)
{
int NOD=q.top();
q.pop();
viz[NOD]=false;
for(size_t j=0; j<G[NOD].size();++j)
{
int node=G[NOD][j].first;
int cost=G[NOD][j].second;
if(D[node]>D[NOD]+cost)
{
D[node]=D[NOD]+cost;
if(!viz[node])
{
q.push(node);
viz[node]=true;
}
}
}
}
//for(int i = 1; i <= n ; ++i)
//cout << D[i]<<" ";
//cout <<endl;
}
int main()
{
int T,sursa;
in >> T ;
for ( int i =1 ; i <= T ; ++i)
{ for(int qq=1;qq<=n;++qq)
G[qq].clear();
in >> n >> m >>sursa;
for (int j =1 ; j<=n ;++j)
in>>ver[j];
for(int j =1 ; j<=m ;++j)
{
int x,y,cost;
in>>x>>y>>cost;
G[x].push_back(make_pair(y,cost));
G[y].push_back(make_pair(x,cost));
}
diji(sursa);
if(FS())out<<"DA\n";
else out<<"NU\n";
}
return 0;
}
bool FS()
{
for(int i =1; i<=n ;++i)
if(D[i]!=ver[i])return false;
return true;
}