Pagini recente » Cod sursa (job #275238) | Cod sursa (job #389840) | Cod sursa (job #276061) | Cod sursa (job #390218) | Cod sursa (job #278481)
Cod sursa(job #278481)
#include <iostream>
#include <fstream>
using namespace std;
#define mMax 300000
#define nMax 50001
#define inf 0x3f3f3f3f
typedef struct{
int x,y,c;
} muchie;
int nr, n, m, sursa,d1[nMax],d2[nMax];
string rez[2] = {"NU","DA"};
muchie G[mMax];
ifstream fin;
int bellmanford(){
int cont = 1;
while (cont){
cont = 0;
for (int i=0;i<m*2;i++){
if (d2[G[i].y] > d2[G[i].x] + G[i].c)
d2[G[i].y] = d2[G[i].x] + G[i].c, cont = 1;
if (d2[G[i].y] < d1[G[i].y])
return 0;
}
}
for (int i=0;i<n;i++){
if (d1[i] != d2[i])
return 0;
}
return 1;
}
void citire(){
ifstream fin("distante.in");
ofstream fout("distante.out");
fin >> nr;
// za main loop
for (int i=0;i<nr;i++){
// read za graph
fin >> n >> m >> sursa;
sursa -= 1;
for (int j=0; j<n; j++){
fin >> d1[j];
d2[j] = inf;
}
d2[sursa] = 0;
for (int j=0; j<=m; j++){
int a = j*2, b=j*2+1;
fin >> G[a].x >> G[a].y >> G[a].c;
G[a].x -= 1, G[a].y -= 1;
G[b].x = G[a].y, G[b].y = G[a].x, G[b].c = G[a].c;
if ( G[a].x == sursa )
d2[G[a].y] = G[a].c;
if ( G[b].x == sursa )
d2[G[b].y] = G[b].c;
}
// compare za distances
fout << rez[bellmanford()] << "\n";
}
fin.close(), fout.close();
}
int main(){
citire();
return 0;
}