Pagini recente » Cod sursa (job #2299071) | Cod sursa (job #835800) | Cod sursa (job #2140474) | Cod sursa (job #2415695) | Cod sursa (job #166805)
Cod sursa(job #166805)
#include <iostream>
#include <vector>
using namespace std;
typedef pair<int, int> edge;
#define INF 1<<30
int N, M, S;
int D[50001],
d[50001];
vector<edge> G[50001];
int q[50001];
int sq, eq;
bool inq[50001];
void dijkstra() {
memset(inq, 0, sizeof(inq));
for (int i(1); i <= N; ++i)
d[i] = INF;
sq = eq = 0;
q[eq++] = S;
inq[S] = true;
d[S] = 0;
while (sq != eq) {
int u = q[sq];
//cout << "Sunt la " << u << endl;
for (vector<edge>::iterator it = G[u].begin(); it != G[u].end(); ++it)
if (d[u] + it->second < d[it->first]) {
d[it->first] = d[u] + it->second;
//cout << d[u] << " " << it->second << endl;
//cout << "Distanta pana la " << it->first << " este " << d[it->first] << endl;
if (!inq[it->first]) {
q[eq] = it->first;
inq[it->first] = true;
eq = (eq + 1) % N;
}
}
sq = (sq + 1) % N;
inq[u] = false;
}
}
int main(int argc, char *argv[]) {
FILE *fi = fopen("distante.in", "r");
int T;
fscanf(fi, "%d", &T);
FILE *fo = fopen("distante.out", "w");
while (T--) {
fscanf(fi, "%d %d %d", &N, &M, &S);
int u, v, w;
for (int i(1); i <= N; ++i)
G[i].clear();
for (int i(1); i <= N; ++i)
fscanf(fi, "%d", D + i);
for (int i(0); i < M; ++i) {
fscanf(fi, "%d %d %d", &u, &v, &w);
G[u].push_back(make_pair(v, w));
G[v].push_back(make_pair(u, w));
//cout << u << " " << v << " " << w << ": " << G[u].size() << " " << G[u].size() << endl;
}
/*for (int i(1); i <= N; ++i) {
cout << i << ": ";
for (vector<edge>::iterator j = G[i].begin(); j != G[i].end(); ++j)
cout << j->first << "(" << j->second << ") ";
cout << endl;
}*/
// SOLUTIA 1: 100 puncte
/*dijkstra();
if (memcmp(D + 1, d + 1, N * sizeof(D[0])) == 0)
fprintf(fo, "DA\n");
else
fprintf(fo, "NU\n");*/
// SOLUTIA 2
memset(inq, 0, sizeof(inq));
if (D[S] == 0) {
for (int u(1); u <= N; ++u) {
for (vector<edge>::iterator it = G[u].begin(); it != G[u].end(); ++it)
if (D[u] + it->second < D[it->first])
goto namers;
else if (D[u] + it->second == D[it->first])
inq[it->first] = true;
}
for (int v(1); v <= N; ++v)
if ((v != S) && !inq[v])
goto namers;
} else
goto namers;
fprintf(fo, "DA\n");
continue;
namers:
fprintf(fo, "NU\n");
continue;
}
fclose(fo);
fclose(fi);
return 0;
}