Pagini recente » Cod sursa (job #1472992) | Istoria paginii runda/cnitv_septembrie_1/clasament | Cod sursa (job #404770) | Cod sursa (job #1344543) | Cod sursa (job #72689)
Cod sursa(job #72689)
Utilizator |
|
Data |
14 iulie 2007 22:31:36 |
Problema |
Distante |
Scor |
0 |
Compilator |
cpp |
Status |
done |
Runda |
Arhiva de probleme |
Marime |
1.74 kb |
#include <iostream>
#include <fstream>
#include <iomanip>
#include <vector>
#include <set>
#include <iterator>
using namespace std;
#define FIN "distante.in"
#define FOUT "distante.out"
#define _INF 10000
#define MAX_N 50005
typedef vector<int> VI;
typedef VI::iterator IT;
typedef vector<bool> VB;
VI d;
VB sel, inq;
vector<VI> c;
vector<VI>::iterator i, final;
int n, m, S;
int L;
int D[MAX_N];
int T,ii;
struct Functor {
bool operator () (int i, int j)
{
return d[i] < d[j];
}
};
multiset<int, Functor> Q;
void Read();
void Write();
void Dijkstra();
int main()
{
freopen (FIN,"r",stdin);
freopen (FOUT,"w",stdout);
scanf("%d",&T);
for (ii=1; ii<=T; ii++)
{
scanf("%d %d %d",&n,&m,&S);
d.resize(n + 1),
c.resize(n + 1);
inq.resize(n + 1);
for ( int i = 0; i <= n; i++ )
c[i].resize(n + 1);
int X;
for (int i=1; i<=n; i++) scanf("%d",D+i);
for ( int i = 0; i <= n; i++ )
c[i].assign(n + 1, _INF);
int x, y, cost;
for ( int i = 0; i < m; ++i)
{
scanf("%d %d %d",&x,&y,&cost);
c[x][y] = c[y][x] = cost;
}
for ( int i = 0; i <= n; i++ )
c[i][i] = 0;
Dijkstra();
Write();
}
return 0;
}
void Dijkstra()
{
d.assign(n + 1, _INF);
d[S] = 0;
Q.insert(S);
inq[S] = true;
int k;
while ( !Q.empty() )
{
k = *Q.begin();
Q.erase(Q.begin()); // sterge numai primul element, chiar daca urmatorul are aceeasi valoare pt d[]
inq[k] = false;
for (int i = 1; i <= n; ++i)
if (d[i] > d[k] + c[k][i] )
{
if ( inq[i] )
Q.erase(i);
else
inq[i] = true;
d[i] = d[k] + c[k][i];
Q.insert(i);
}
}
}
void Write()
{
int ok=1;
for ( int i = 1; i <= n; i++ )
if (d[i]!=D[i]) { ok=0; break; }
if (ok) printf("DA\n"); else printf("NU\n");
}