Pagini recente » Cod sursa (job #292734) | Cod sursa (job #409216) | Cod sursa (job #848783) | Cod sursa (job #278285) | Cod sursa (job #2818323)
#include <iostream>
#include <fstream>
#include <set>
#include <climits>
#include <vector>
#define inf INT_MAX-10000
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
void dijkstra(unsigned int n, unsigned int m,unsigned int s, vector<vector<pair<int,int>>> lista_vecini, int cf[])
{
unsigned int i;
int d[n+1];
set<pair<int,int>> set_noduri;
for (i=1; i<=n; ++i)
{
d[i]=inf;
}
d[s]=0;
set_noduri.insert(make_pair(0,s));
while (!set_noduri.empty())
{
int nod=(*set_noduri.begin()).second;
set_noduri.erase(set_noduri.begin());
for (int i=0; i<lista_vecini[nod].size(); ++i)
{
int nod_dest=lista_vecini[nod][i].first;
int cost_dest=lista_vecini[nod][i].second;
if (d[nod]+cost_dest<d[nod_dest])
{
if (d[nod_dest]!=inf)
{
set_noduri.erase(set_noduri.find(make_pair(d[nod_dest],nod_dest)));
}
d[nod_dest]=d[nod]+cost_dest;
set_noduri.insert(make_pair(d[nod_dest],nod_dest));
}
}
}
bool ok=true;
for (unsigned int i=1; i<=n; ++i)
{
if (d[i]!=cf[i])
{
g<<"NU";
ok=false;
break;
}
}
if (ok)
g<<"DA";
g<<"\n";
}
int main()
{
int t,n,m,s,i,j;
f>>t;
for (i=0; i<t; ++i)
{
vector<vector<pair<int,int>>> lista_vecini;
f>>n>>m>>s;
lista_vecini.resize(n+1);
int cf[n+1];
for (j=1; j<=n; ++j)
f>>cf[j];
for (j=0; j<m; ++j)
{
int x,y,c;
f>>x>>y>>c;
lista_vecini[x].push_back(make_pair(y,c));
lista_vecini[y].push_back(make_pair(x,c));
}
dijkstra(n, m, s, lista_vecini, cf);
}
}