Pagini recente » Cod sursa (job #395113) | Cod sursa (job #488336) | Cod sursa (job #2476435) | Cod sursa (job #1656991) | Cod sursa (job #2829795)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
#define inf 1000000000
int n,m,x,y;
#define Nmax 50007
vector< pair<int,int> > node_with_cost[Nmax];
vector<int> dijkstra(int source)
{
vector<int> dist(n+1,inf);
vector<bool> visited(n+1,false);
priority_queue<pair<int,int>,vector<pair<int,int>>,greater< pair<int,int> > > pq;
dist[source]=0;
pq.push(make_pair(0,source));
while(!pq.empty())
{
int u=pq.top().second;
pq.pop();
if(visited[u]) continue;
visited[u]=true;
for(auto i=node_with_cost[u].begin();
i!=node_with_cost[u].end();++i)
{
int v=(*i).first;
int weight = (*i).second;
if(dist[v]>dist[u]+weight)
{
dist[v]=dist[u]+weight;
pq.push(make_pair(dist[v],v));
}
}
}
return dist;
}
int main()
{
//problema distante-infoarena
//idee: pentru calcularea distantelor folosim dijsktra
//facem asta pentru ca datele sunt pozitive
int numar_graf,cost;
int bronzarel[Nmax];
f>>numar_graf;
int source;
for(int i=1;i<=numar_graf;i++)
{
f>>n>>m>>source;
for(int i=1;i<=n;i++)
{
f>>bronzarel[i];
node_with_cost[i].clear();
}
for(int i=0;i<m;i++)
{
f>>x>>y>>cost;
node_with_cost[x].push_back(make_pair(y,cost));
node_with_cost[y].push_back(make_pair(x,cost));
}
vector<int> bumbarel = dijkstra(source);
int ok=1;
for(int i=1;i<=n;i++)
if(bumbarel[i]!=bronzarel[i])
{
ok=0;
g<<"NU\n";
break;
}
if(ok)
g<<"DA"<<"\n";
}
g.close();
return 0;
}