Pagini recente » Monitorul de evaluare | Cod sursa (job #747068) | Cod sursa (job #1606828) | Cod sursa (job #1488357) | Cod sursa (job #1428067)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <queue>
#include <vector>
using namespace std;
#define IN_FILE_NAME "distante.in"
#define OUT_FILE_NAME "distante.out"
typedef struct _EDGE
{
int dest;
int cost;
}EDGE;
unsigned int givenDistances[50000];
unsigned int foundDistances[50000];
vector<vector<EDGE*>> Edges = vector<vector<EDGE*>>(50000);
void InsertEdge(vector<EDGE*> *Line, int Dest, int Cost)
{
EDGE *Edge = (EDGE*)malloc(sizeof(EDGE));
Edge->cost = Cost;
Edge->dest = Dest;
Line->push_back(Edge);
}
int main()
{
int tests = 0, t = 0;
FILE *pFin, *pFout;
pFin = fopen(IN_FILE_NAME, "r");
pFout = fopen(OUT_FILE_NAME, "w");
fscanf(pFin, "%d", &tests);
for(t=0; t<tests; t++)
{
int n, m, s;
fscanf(pFin, "%d %d %d", &n, &m, &s);
memset(givenDistances, 1, sizeof(givenDistances));
memset(foundDistances, 1, sizeof(foundDistances));
int i;
for(i=0; i<n; i++)
{
int nr;
fscanf(pFin, "%d", &nr);
givenDistances[i] = nr;
}
s-=1;
for(i=0; i<m; i++)
{
// Read edges
int a,b,c;
fscanf(pFin, "%d %d %d", &a, &b, &c);
a-=1; b-=1;
InsertEdge(&(Edges[a]), b, c);
InsertEdge(&(Edges[b]), a, c);
}
// Dijkstra
EDGE *sourceEdge = new EDGE;
sourceEdge->cost = 0;
sourceEdge->dest = s;
queue<EDGE*> *Queue = new queue<EDGE*>();
Queue->push(sourceEdge);
do
{
EDGE *currEdge = Queue->front();
Queue->pop();
int dest = currEdge->dest;
int cost = currEdge->cost;
if(cost > foundDistances[dest])
{
}
else
{
int i;
foundDistances[dest] = cost;
for(i=0; i<Edges[dest].size(); i++)
{
EDGE *neighbourEdge = Edges[dest][i];
int newDest = neighbourEdge->dest;
int newCost = neighbourEdge->cost + cost;
if(newCost < foundDistances[newDest])
{
EDGE *newEdge = new EDGE();
newEdge->dest = newDest;
newEdge->cost = newCost;
Queue->push(newEdge);
}
}
}
delete currEdge;
}while(!Queue->empty());
bool bOk = true;
for(i=0; i<n; i++)
{
if(foundDistances[i] != givenDistances[i])
{
bOk = false;
break;
}
}
if(bOk)
printf("DA\n");
else
printf("NU\n");
}
fclose(pFin);
fclose(pFout);
return 0;
}