Pagini recente » Cod sursa (job #2265020) | Cod sursa (job #1723644) | Cod sursa (job #1114760) | Cod sursa (job #2587076) | Cod sursa (job #166795)
Cod sursa(job #166795)
#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() {
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;
}*/
dijkstra();
/*for (int i(1); i <= N; ++i)
cout << d[i] << " ";
cout << endl;*/
if (memcmp(D + 1, d + 1, N * sizeof(D[0])) == 0)
fprintf(fo, "DA\n");
else
fprintf(fo, "NU\n");
}
fclose(fo);
fclose(fi);
return 0;
}