Pagini recente » Cod sursa (job #2365240) | Cod sursa (job #391702) | Cod sursa (job #1418920) | Cod sursa (job #146135) | Cod sursa (job #1095819)
#include <fstream>
#include <iostream>
#define infinity 63366
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
int A[100][100], cost[100][100], visited[100], dist[100], n, previous[100];
struct element{
int nod;
element* next;
}*prim;
void addr(int x){
element *p;
p = new element;
p -> nod = x;
p -> next = NULL;
if(prim == NULL)
prim = p;
else {
element* q = prim;
while(q -> next != NULL)
q = q -> next;
q -> next = p;
}
}
void deletenod(int v) {
element* p;
p = prim;
if(p -> nod == v){
prim = NULL;
delete p;
}
else {
while (p -> nod != v)
p = p -> next;
element* q;
q = prim;
while (q -> next != p)
q = q -> next;
q -> next = p -> next;
delete p;
}
}
int sdnv (){
int minim = infinity;
int nodus;
element *p;
p = prim;
while (p != NULL) {
if (minim > dist[p -> nod] && !visited[p -> nod]) {
minim = dist[p -> nod];
nodus = p -> nod;
}
p = p -> next;
}
return nodus;
}
void dijkstra (int source) {
int i, u, alt;
for (i = 1; i <= n; i++)
dist[i] = infinity;
dist[source] = 0;
addr (source);
while (prim != NULL) {
u = sdnv (); //sMALLEST dIST nOT vISITED
//cout << u << " ";
deletenod (u);
visited[u] = 1;
for (i = 1; i <= n; i++) {
if (A[i][u] == 1) {
alt = dist[u] + cost[u][i];
if (alt < dist[i]) {
dist[i] = alt;
previous[i] = u;
if(!visited[i])
addr(i);
}
}
}
}
}
int main(){
int i, x, m, c, y;
fin >> n >> m;
for (i = 1; i <= m; i++) {
fin >> x >> y >> c;
A[x][y] = A[y][x] = 1;
cost[x][y] = cost[y][x] = c;
}
/*for (i = 1; i <= n; i++) {
cout << "\n";
for (j = 1; j <= n; j++)
cout << A[i][j] << " ";
}*/
dijkstra(1);
for(i = 2; i <= n; i++)
fout << dist[i] << " ";
return 0;
}