Pagini recente » Cod sursa (job #646615) | Cod sursa (job #2658118) | Cod sursa (job #1141316) | Cod sursa (job #1095469) | Cod sursa (job #654270)
Cod sursa(job #654270)
#include <climits>
#include <fstream>
#include <vector>
#include <set>
using namespace std;
typedef vector < vector < pair<int,int> > > graph;
int main()
{
ifstream fin("distante.in",ifstream::in);
ofstream fout("distante.out",ofstream::out);
int T;
fin >> T;
while(T--)
{
int V,E,S;
fin >> V >> E >> S;
--S;
graph G(V);
vector < int > dists (V);
for(int i=0;i<G.size();++i)
{
fin >> dists[i];
}
while(E--)
{
int src,dest,cap;
fin >> src >> dest >> cap;
G[--src].push_back ( make_pair(--dest,cap) );
G[dest].push_back( make_pair(src,cap) );
}
vector < int > cmin(G.size(),INT_MAX);
{
set < pair <int,int> > Q;
cmin[S] = 0;
Q.insert( pair<int,int>(0,S) );
while(!Q.empty())
{
int minNode = Q.begin()->second, minCost = Q.begin()->first;
Q.erase(Q.begin());
for(vector< pair<int,int> > :: iterator edge = G[minNode].begin(); edge != G[minNode].end(); ++edge)
{
if(cmin[edge->first] > minCost + edge->second )
{
if( cmin[edge->first] != INT_MAX)
{
Q.erase(Q.find( pair<int,int>(cmin[edge->first],edge->first) ) );
}
cmin[edge->first] = minCost + edge->second;
Q.insert ( pair<int,int> ( cmin[edge->first], edge->first ) );
}
}
}
}
fout << ( dists == cmin ? "DA" : "NU" ) << '\n' ;
}
return 0;
}