Pagini recente » Cod sursa (job #682175) | Cod sursa (job #619334) | Cod sursa (job #788931) | Cod sursa (job #2698832) | Cod sursa (job #1255055)
#include <fstream>
#include <iostream>
using namespace std;
class path
{
public:
int to;
long dist;
path *next;
void deleteNext()
{
path * toDelete = next;
if (toDelete != NULL)
{
next = toDelete->next;
delete toDelete;
}
}
};
char visited[30002];
path * adiacList[30002];
int n;
long calcDist(int x, int y)
{
path *queue_start = new path, *queue_end, *roads;
queue_start->to = x;
queue_start->dist = 0;
queue_end = queue_start;
visited[x] = 1;
int i;
long int d;
while ((queue_start->next != NULL) && (queue_start->to != y))
{
i = queue_start->to;
d = queue_start->dist;
roads = adiacList[i];
if (roads != NULL)
{
if (!visited[roads->to])
{
queue_end->next = new path;
queue_end = queue_end->next;
visited[queue_end->to = roads->to] = 1;
queue_end->dist = (i < roads->to) ? (d + roads->dist) : (d - roads->dist);
}
while (roads->next)
{
roads = roads->next;
if (!visited[roads->to])
{
queue_end->next = new path;
queue_end = queue_end->next;
visited[queue_end->to = roads->to] = 1;
queue_end->dist = (i < roads->to) ? (d + roads->dist) : (d - roads->dist);
}
}
}
roads = queue_start;
queue_start = queue_start->next;
delete roads;
}
long int dFinal = -1;
if (queue_start != NULL)
{
dFinal = queue_start->dist;
return dFinal;
}
/*while (queue_start != NULL)
{
queue_end = queue_start;
queue_start = queue_start->next;
delete queue_end;
}*/
return dFinal;
}
int main()
{
//FILE *fin = fopen("ciclueuler.in", "r");
//FILE *fout = fopen("ciclueuler.out", "w");
ifstream fin("sate.in");
ofstream fout("sate.out");
long m;
int i, j, d, x, y;
//fscanf(fin, "%d %d", &n, &m);
fin >> n >> m >> x >> y;
path *ptrPath;
while (m--)
{
fin >> i >> j >> d;
ptrPath = adiacList[i];
adiacList[i] = new path;
adiacList[i]->to = j;
adiacList[i]->dist = d;
adiacList[i]->next = ptrPath;
ptrPath = adiacList[j];
adiacList[j] = new path;
adiacList[j]->to = i;
adiacList[j]->dist = d;
adiacList[j]->next = ptrPath;
//fscanf(fin, "%d %d", &i, &j);
}
m = calcDist(x, y);
//cout << m;
fout << m << "\n";
//fclose(fin);
//fclose(fout);
return 0;
}