[shkola] dijkstra & floyd
- From: Rangel Dokov <rangel_dokov@xxxxxx>
- To: shkola@xxxxxxxxxxxxx
- Date: Sat, 18 Oct 2003 21:03:11 +0300
Prashtam vi koda na dvata algorityma (ne che gi nqma vyv vsqka kniga, no
vse pak).
Shte vi pratq i dijkstra s piramida v blizko bydeshte (v momenta malko me e
myrzel).
A shte vi namerq i malko zadachki za domashno, no i tova posle ;-)
--
Rangel Dokov
#include <stdio.h>
// maksimalniq broj vyrhove v grafa
#define MAXN 100
// tova trqbva da e po-golqmo ot dylzhinata na naj-dylgiq (prost) pyt
// v grafa
#define INF 2000000l
// matrica na sysedstvo opisvashta grafa
// v kletka adj[i][j] stoi cenata na pytq ot `i' do `j'
int adj[MAXN][MAXN];
// broj na vyrhovete v graf-a
int n;
// raztoqnieto ot nachalniq vryh do vseki drug
int dist[MAXN];
// spisak na posetenite
int visited[MAXN];
int parent[MAXN]; // optional
void dijkstra (int s) {
int i, min;
// inicializaciq na raztoqniqta
for (i = 0; i < n; i++)
dist[i] = INF;
// slagame nachalniq vryh
dist[s] = 0;
min = 0;
while (1) {
// namirame naj-blizkiq vryh kojto ne e bil poseten
for (i = 0; i < n; i++)
if ((visited[min]) ||
(!visited[i] && dist[i] <dist[min]))
min = i;
// tova pokazva che ne sme namerili neposeten vryh
// t.e. kraj
if (visited[min])
break;
// `poseshtavame' vyrha i presmqtame novite raztoqnie
visited[min] = 1;
for (i = 0; i < n; i++)
if (adj[min][i] && (dist[min]+adj[min][i] < dist[i])) {
dist[i] = dist[min] + adj[min][i];
parent[i] = min; //optional
}
}
}
/*
vhoden fajl:
pyrvi red: N E (syotvetno broj vyrhove i broj rebra)
oshte E reda s opisanie na rebrata - nachalen vryh, kraen vryh, cena
primer:
3 3
1 2 5
1 3 10
2 3 3
*/
void read_data() {
int s, t, c, e;
scanf ("%d%d", &n, &e);
while (e-- > 0) {
scanf("%d%d%d", &s, &t, &c);
s--; t--;
adj[s][t] = c;
adj[t][s] = c; // tova go nqma ako grafa e orientiran
}
}
void print_dist() {
int i;
for (i = 0; i < n; i++)
printf("distance to node %d is %d\n", i, dist[i]);
}
int main() {
read_data();
dijkstra (0);
print_dist();
return 0;
}
// za malko poveche obqsneniq vizhte dijsktra.c
#include <stdio.h>
#define MAXN 100
#define INF 2000000l
int adj[MAXN][MAXN];
int n;
// v tova se zapisvat raztoqniqta mezhdu vseki 2 vyrha
int dist[MAXN][MAXN];
void floyd() {
int i, j, k;
// inicializaciq na dylzhinite
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
// razchitam che ako nqma rebro cenata e 0
// t.e. 0 e nevalidna cena
// mozhe da se smeni na -1, no togava shte trqbva
// da se inicializira matricata na sysedstvo
if (adj[i][j] > 0)
dist[i][j] = adj[i][j];
else
dist[i][j] = INF;
dist[i][i] = 0;
}
// tova si e samiq floyd
// razpolozhenieto na ciklite _ima_ znachenie
for (k = 0; k < n; k++)
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (dist[i][k] + dist[k][j] < dist[i][j])
dist[i][j] = dist[i][k] + dist[k][j];
}
// za formata na vhoda vizh dijkstra.c
void read_data() {
int s, t, c, e;
scanf ("%d%d", &n, &e);
while (e-- > 0) {
scanf ("%d%d%d", &s, &t, &c);
s--; t--;
adj[s][t] = c;
adj[t][s] = c;
}
}
void print_dist() {
int i, j;
printf ("Distances are:\n\n");
for (i = 0; i < n; i++) {
printf ("%d", dist[i][0]);
for (j = 1; j < n; j++)
printf (" %d", dist[i][j]);
printf ("\n");
}
}
int main () {
read_data();
floyd();
print_dist();
return 0;
}
Other related posts: