Pagini recente » Cod sursa (job #62250) | Cod sursa (job #3154155) | Cod sursa (job #1307114) | Cod sursa (job #1964437) | Cod sursa (job #2070624)
#include <fstream>
#include <bitset>
#include <vector>
#include <queue>
#define nmax 50002
#define infinit 100000000
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
struct duet{
int vecin,cost;
};
class cmp{
public:
bool operator() (duet A,duet B)
{
if(A.cost==B.cost)
{
return A.vecin>B.vecin;
}
return A.cost>B.cost;
}
};
int distanta[nmax];
int distanta_calculata[nmax];
priority_queue <duet,vector <duet>,cmp> coada;
bitset <nmax> vizitat;
vector <duet> graf[nmax];
int main()
{
int nr_teste,n,m,start,x,y,c;
fin>>nr_teste;
for(int pas=nr_teste;pas;pas--)
{
fin>>n>>m>>start;
for(int i=1;i<=n;i++)
{
vizitat[i]=0;
distanta[i]=infinit;
}
for(int i=1;i<=n;i++)
{
fin>>distanta_calculata[i];
}
for(int i=1;i<=m;i++)
{
fin>>x>>y>>c;
duet ac;
ac.vecin=y;
ac.cost=c;
graf[x].push_back(ac);
ac.vecin=x;
graf[y].push_back(ac);
}
distanta[start]=0;
coada.push({start,0});
while(!coada.empty())
{
int nod=coada.top().vecin;
int costa=coada.top().cost;
coada.pop();
if(vizitat[nod]==0){
for(int i=0;i<graf[nod].size();i++)
{
if(distanta[graf[nod][i].vecin]>costa+graf[nod][i].cost)
{
distanta[graf[nod][i].vecin]=costa+graf[nod][i].cost;
coada.push({graf[nod][i].vecin,distanta[graf[nod][i].vecin]});
}
}
}
vizitat[nod]=1;
}
int conditie=0;
for(int i=1;i<=n;i++)
{
if(distanta[i]!=distanta_calculata[i]){
conditie=1;break;
}
}
if(conditie)
fout<<"NU\n";
else
fout<<"DA\n";
}
return 0;
}