Pagini recente » Cod sursa (job #3322793) | Cod sursa (job #3354160) | Cod sursa (job #517174) | Borderou de evaluare (job #249380) | Cod sursa (job #2418567)
#include <iostream>
#include <fstream>
#include <limits.h>
using namespace std;
ifstream fin("dijkstra.in");
class Dijkstra
{
int V;
int src;
int **graph;
int *dist;
bool *sptSet;
public:
Dijkstra(int noduri, int start)
{
V = noduri;
src = start;
int m, a, b, c;
fin>>m;
dist = new int[V+1];
sptSet = new bool[V+1];
for (int i = 0; i <= V; i++)
dist[i] = INT_MAX, sptSet[i] = false;
dist[src] = 0;
graph = new int *[V+1];
for(int i = 0; i <= V; i++)
graph[i] = new int[V+1];
for(int i = 0; i <= V; i++)
for(int j = 0; j <= V; j++)
graph[i][j] = 0;
for(int i = 0; i < m; i++)
{
fin>>a>>b>>c;
graph[a][b] = c;
}
dijkstra(graph);
}
int minDistance()
{
int minn = INT_MAX, mini = 0;
for (int v = 1; v <= V; v++)
if (sptSet[v] == false && dist[v] <= minn)
minn = dist[v], mini = v;
return mini;
}
void printSolution()
{
ofstream fout("dijkstra.out");
for (int i = 2; i <= V; i++)
if(dist[i] != INT_MAX)
fout<<dist[i]<<" ";
else
fout<<"0 ";
fout.close();
}
void dijkstra(int **graph)
{
for (int count = 0; count < V-1; count++)
{
int u = minDistance();
sptSet[u] = true;
for (int v = 1; v <= V; v++)
if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX
&& dist[u]+graph[u][v] < dist[v])
dist[v] = dist[u] + graph[u][v];
}
printSolution();
}
~Dijkstra()
{
for(int i = 0; i <= V; i++)
delete[] graph[i];
delete[] graph;
fin.close();
}
};
int main()
{
int n;
fin>>n;
Dijkstra A(n, 1);
return 0;
}