Pagini recente » Cod sursa (job #341122) | Borderou de evaluare (job #2510961) | Cod sursa (job #920782) | Borderou de evaluare (job #2513992) | Cod sursa (job #1125515)
// DISTANTE
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <limits>
#include <utility>
#define pb push_back
#define mkp make_pair
#define DMAX 50005
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
const int INF=numeric_limits<int>::max();
vector<vector<pair<int,int> > >G(DMAX);
multiset<pair<int,int> > H;
int DI[DMAX], D[DMAX];
int t,n,m,s;
void init();
bool Dijkstra(int start);
int main()
{
f>>t;
for(int i=1;i<=t;i++)
{
f>>n>>m>>s;
for(int j=1;j<=n;j++)
f>>DI[j];
for(int j=1;j<=m;j++)
{
int x,y,w;
f>>x>>y>>w;
G[x].pb(mkp(y,w));
G[y].pb(mkp(x,w));
}
if(Dijkstra(s)==false)
g<<"NU\n";
else
g<<"DA\n";
init();
}
return 0;
}
void init()
{
for(int i=1;i<=n;i++)
{
G[i].clear();
DI[i]=0;
}
}
bool Dijkstra(int start)
{
int nodc;
for(int i=1;i<=n;i++)
D[i]=INF;
D[start]=0;
H.insert(mkp(0,start));
while(!H.empty())
{
nodc=H.begin()->second;
H.erase(H.begin());
if(DI[nodc]!=D[nodc]) return false;
for(vector<pair<int,int> >::iterator it=G[nodc].begin();it!=G[nodc].end();it++)
{
if(D[it->first]>D[nodc]+it->second)
{
if(D[it->first]!=INF) H.erase(H.find(mkp(D[it->first],it->first)));
D[it->first]=D[nodc]+it->second;
H.insert(mkp(D[it->first],it->first));
}
}
}
return true;
}