Pagini recente » Cod sursa (job #584593) | Cod sursa (job #36675) | Cod sursa (job #1699138) | Cod sursa (job #2412067) | Cod sursa (job #1428882)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream ka("distante.in");
ofstream ki("distante.out");
const int N_MAX = 50000;
bool vazut[N_MAX + 1];
int t, n, m, s, a, b, c, distanta[N_MAX + 1];
struct muchie
{
int index, cost;
bool operator < (const muchie arg) const
{
return cost > arg.cost;
}
};
vector <muchie> graf[N_MAX + 1];
priority_queue <muchie> coada;
string dijkstra()
{
muchie mm;
mm.index = s;
mm.cost = 0;
coada.push(mm);
vazut[s] = true;
while(!coada.empty())
{
int t = coada.top().index;
coada.pop();
for(int i = 0; i < graf[t].size(); i++)
{
if(distanta[t] + graf[t][i].cost == distanta[graf[t][i].index] && !vazut[graf[t][i].index])
{
vazut[graf[t][i].index] = true;
muchie mm;
mm.index = graf[t][i].index;
mm.cost = distanta[mm.index];
coada.push(mm);
}
}
}
for(int i = 1; i <= n; i++)
if(!vazut[i])
return "NU";
return "DA";
}
int main()
{
ka >> t;
for(int i = 1; i <= t; i++)
{
ka >> n >> m >> s;
for(int j = 1; j <= n; j++)
{
ka >> distanta[j];
vazut[j] = false;
graf[j].clear();
}
for(int j = 1; j <= m; j++)
{
ka >> a >> b >> c;
muchie mm;
mm.index = b;
mm.cost = c;
graf[a].push_back(mm);
mm.index = a;
graf[b].push_back(mm);
}
ki << dijkstra() << '\n';
}
}