Revision: 53006
Updated Code
at November 10, 2011 08:47 by stakisko
Updated Code
/*
*
* Created on: Nov 4, 2011
* Author: stakisko
* Email : konmpar at gmail com
*/
/*
#include <stdio.h>
#include <stdlib.h>
typedef struct _node node;
typedef struct _acne acne;
/*
* There are two structures.
* 'Node' represent each node having childrens acnes represent each connected to him nodes.
* 'Acne' represent each acne connecting two Nodes.
*/
struct _node {
int distance; // distance from the first node
struct _acne *children[100]; // going to nodes
int edgeno; // how many nodes are connected to
int name;
};
struct _acne {
int value; // distance between these edges
int from; // acne connecting from
int to; // to
struct _node *edge;
};
/*
* for every node we are going in (the parameter) we search its connected childs nodes and
* calculate their distances. then we are going in again( recursion ) in the node with the
* minimum distance
*
* */
int traverse(struct _node *node){
if(node->edgeno<=0)
return 0;
printf("start of node %d\n", node->name);
printf("\tchildrens: %d\n", node->edgeno);
int mindistance = node->children[0]->value;
int minnode = 0;
int i;
for(i=0;i<node->edgeno; i++){
if(node->distance + node->children[i]->value < node->children[i]->edge->distance ){
node->children[i]->edge->distance = node->distance + node->children[i]->value;
}
if (mindistance > node->children[i]->edge->distance){
mindistance = node->children[i]->edge->distance;
minnode = i;
}
printf("\tfrom %d to %d with distance %d\n", node->children[i]->from, node->children[i]->to, node->children[i]->edge->distance);
}
printf("\tmin node %d\n", node->children[minnode]->to);
printf("end of node\n-----------------------\n");
traverse(node->children[minnode]->edge);
return 0;
}
// main function
int main(int argc, char *argv[]){
FILE *ifp;
int t, t1, t2;
int nodesNo = 0;
int edgesNo = 0;
ifp = fopen("/home/kostas/Downloads/dijkstra1.dat", "r");
if (ifp == NULL) {
fprintf(stderr, "Can't open input file dijkstra.dat!\n");
exit(1);
}
fscanf(ifp, "%d %d", &nodesNo, &edgesNo);
struct _node nodes[nodesNo];
struct _acne acnes[edgesNo];
int i = 0; // count the acnes
int previous = 0;
int k = 0; // count childs for every node
/*
* Files content should be in the format
* n N
* startNode endNode distance
* startNode endNode distance
* .
* .
* .
* startNode endNode distance
*
* where n is the total number of Nodes and N is the total number of Acnes
*
*/
while(fscanf(ifp, "%d %d %d", &t, &t1, &t2) == 3){ /* read from file */
/*
* Then for every line we create a node and also
* an acne to place the connected edges.
*
*/
if(previous != t)
k = 0;
nodes[t].distance = 65000; // infinite
nodes[t].name = t;
acnes[i].from = t;
acnes[i].to = t1;
acnes[i].value = t2;
acnes[i].edge = &nodes[t1];
nodes[t].children[k] = &acnes[i];
nodes[t].edgeno = k+1;
i++;
k++;
previous = t;
}
// set firsts node's distance
nodes[0].distance = 0;
// set last node
nodes[nodesNo-1].distance = 65000;
nodes[nodesNo-1].edgeno = 0;
nodes[nodesNo-1].name = nodesNo-1;
int j;
for(j=0; j< (sizeof(nodes)/sizeof(*nodes));j++)
printf("node %d, distance %d, edgeno %d\n", nodes[j].name, nodes[j].distance, nodes[j].edgeno);
for(j=0; j< sizeof(acnes)/sizeof(*acnes);j++)
printf("from %d, to %d, value %d\n", acnes[j].from, acnes[j].edge->name, acnes[j].value);
printf("\n-----------\n");
traverse(&nodes[0]);
printf("\n-----------\n");
for(j=0; j< (sizeof(nodes)/sizeof(*nodes));j++)
printf("nnode %d, distance %d\n", nodes[j].name, nodes[j].distance);
return 0;
}
Revision: 53005
Updated Code
at November 9, 2011 23:23 by stakisko
Updated Code
/*
*
* Created on: Nov 4, 2011
* Author: kostas
* Email : konmpar at gmail com
*/
/*
#include <stdio.h>
#include <stdlib.h>
typedef struct _node node;
typedef struct _acne acne;
/*
* There are two structures.
* 'Node' represent each node having childrens acnes represent each connected to him nodes.
* 'Acne' represent each acne connecting two Nodes.
*/
struct _node {
int distance; // distance from the first node
struct _acne *children[100]; // going to nodes
int edgeno; // how many nodes are connected to
int name;
};
struct _acne {
int value; // distance between these edges
int from; // acne connecting from
int to; // to
struct _node *edge;
};
/*
* for every node we are going in (the parameter) we search its connected childs nodes and
* calculate their distances. then we are going in again( recursion ) in the node with the
* minimum distance
*
* */
int traverse(struct _node *node){
if(node->edgeno<=0)
return 0;
printf("start of node %d\n", node->name);
printf("\tchildrens: %d\n", node->edgeno);
int mindistance = node->children[0]->value;
int minnode = 0;
int i;
for(i=0;i<node->edgeno; i++){
if(node->distance + node->children[i]->value < node->children[i]->edge->distance ){
node->children[i]->edge->distance = node->distance + node->children[i]->value;
}
if (mindistance > node->children[i]->edge->distance){
mindistance = node->children[i]->edge->distance;
minnode = i;
}
printf("\tfrom %d to %d with distance %d\n", node->children[i]->from, node->children[i]->to, node->children[i]->edge->distance);
}
printf("\tmin node %d\n", node->children[minnode]->to);
printf("end of node\n-----------------------\n");
traverse(node->children[minnode]->edge);
return 0;
}
// main function
int main(int argc, char *argv[]){
FILE *ifp;
int t, t1, t2;
int nodesNo = 0;
int edgesNo = 0;
ifp = fopen("/home/kostas/Downloads/dijkstra1.dat", "r");
if (ifp == NULL) {
fprintf(stderr, "Can't open input file dijkstra.dat!\n");
exit(1);
}
fscanf(ifp, "%d %d", &nodesNo, &edgesNo);
struct _node nodes[nodesNo];
struct _acne acnes[edgesNo];
int i = 0; // count the acnes
int previous = 0;
int k = 0; // count childs for every node
/*
* Files content should be in the format
* n N
* startNode endNode distance
* startNode endNode distance
* .
* .
* .
* startNode endNode distance
*
* where n is the total number of Nodes and N is the total number of Acnes
*
*/
while(fscanf(ifp, "%d %d %d", &t, &t1, &t2) == 3){ /* read from file */
/*
* Then for every line we create a node and also
* an acne to place the connected edges.
*
*/
if(previous != t)
k = 0;
nodes[t].distance = 65000; // infinite
nodes[t].name = t;
acnes[i].from = t;
acnes[i].to = t1;
acnes[i].value = t2;
acnes[i].edge = &nodes[t1];
nodes[t].children[k] = &acnes[i];
nodes[t].edgeno = k+1;
i++;
k++;
previous = t;
}
// set firsts node's distance
nodes[0].distance = 0;
// set last node
nodes[nodesNo-1].distance = 65000;
nodes[nodesNo-1].edgeno = 0;
nodes[nodesNo-1].name = nodesNo-1;
int j;
for(j=0; j< (sizeof(nodes)/sizeof(*nodes));j++)
printf("node %d, distance %d, edgeno %d\n", nodes[j].name, nodes[j].distance, nodes[j].edgeno);
for(j=0; j< sizeof(acnes)/sizeof(*acnes);j++)
printf("from %d, to %d, value %d\n", acnes[j].from, acnes[j].edge->name, acnes[j].value);
printf("\n-----------\n");
traverse(&nodes[0]);
printf("\n-----------\n");
for(j=0; j< (sizeof(nodes)/sizeof(*nodes));j++)
printf("nnode %d, distance %d\n", nodes[j].name, nodes[j].distance);
return 0;
}
Revision: 53004
Updated Code
at November 9, 2011 23:07 by stakisko
Updated Code
/*
* dijkstra.c
*
* Created on: Nov 4, 2011
* Author: kostas
*/
/*
#include <stdio.h>
#include <stdlib.h>
typedef struct _node node;
typedef struct _acne acne;
/*
* There are two structures.
* 'Node' represent each node having childrens acnes represent each connected to him nodes.
* 'Acne' represent each acne connecting two Nodes.
*/
struct _node {
int distance; // distance from the first node
struct _acne *children[100]; // going to nodes
int edgeno; // how many nodes are connected to
int name;
};
struct _acne {
int value; // distance between these edges
int from; // acne connecting from
int to; // to
struct _node *edge;
};
/*
* for every node we are going in (the parameter) we search its connected childs nodes and
* calculate their distances. then we are going in again( recursion ) in the node with the
* minimum distance
*
* */
int traverse(struct _node *node){
if(node->edgeno<=0)
return 0;
printf("start of node %d\n", node->name);
printf("\tchildrens: %d\n", node->edgeno);
int mindistance = node->children[0]->value;
int minnode = 0;
int i;
for(i=0;i<node->edgeno; i++){
if(node->distance + node->children[i]->value < node->children[i]->edge->distance ){
node->children[i]->edge->distance = node->distance + node->children[i]->value;
}
if (mindistance > node->children[i]->edge->distance){
mindistance = node->children[i]->edge->distance;
minnode = i;
}
printf("\tfrom %d to %d with distance %d\n", node->children[i]->from, node->children[i]->to, node->children[i]->edge->distance);
}
printf("\tmin node %d\n", node->children[minnode]->to);
printf("end of node\n-----------------------\n");
traverse(node->children[minnode]->edge);
return 0;
}
// main function
int main(int argc, char *argv[]){
FILE *ifp;
int t, t1, t2;
int nodesNo = 0;
int edgesNo = 0;
ifp = fopen("/home/kostas/Downloads/dijkstra1.dat", "r");
if (ifp == NULL) {
fprintf(stderr, "Can't open input file dijkstra.dat!\n");
exit(1);
}
fscanf(ifp, "%d %d", &nodesNo, &edgesNo);
struct _node nodes[nodesNo];
struct _acne acnes[edgesNo];
int i = 0; // count the acnes
int previous = 0;
int k = 0; // count childs for every node
/*
* Files content should be in the format
* n N
* startNode endNode distance
* startNode endNode distance
* .
* .
* .
* startNode endNode distance
*
* where n is the total number of Nodes and N is the total number of Acnes
*
*/
while(fscanf(ifp, "%d %d %d", &t, &t1, &t2) == 3){ /* read from file */
/*
* Then for every line we create a node and also
* an acne to place the connected edges.
*
*/
if(previous != t)
k = 0;
nodes[t].distance = 65000; // infinite
nodes[t].name = t;
acnes[i].from = t;
acnes[i].to = t1;
acnes[i].value = t2;
acnes[i].edge = &nodes[t1];
nodes[t].children[k] = &acnes[i];
nodes[t].edgeno = k+1;
i++;
k++;
previous = t;
}
// set firsts node's distance
nodes[0].distance = 0;
// set last node
nodes[nodesNo-1].distance = 65000;
nodes[nodesNo-1].edgeno = 0;
nodes[nodesNo-1].name = nodesNo-1;
int j;
for(j=0; j< (sizeof(nodes)/sizeof(*nodes));j++)
printf("node %d, distance %d, edgeno %d\n", nodes[j].name, nodes[j].distance, nodes[j].edgeno);
for(j=0; j< sizeof(acnes)/sizeof(*acnes);j++)
printf("from %d, to %d, value %d\n", acnes[j].from, acnes[j].edge->name, acnes[j].value);
printf("\n-----------\n");
traverse(&nodes[0]);
printf("\n-----------\n");
for(j=0; j< (sizeof(nodes)/sizeof(*nodes));j++)
printf("nnode %d, distance %d\n", nodes[j].name, nodes[j].distance);
return 0;
}
Revision: 53003
Updated Code
at November 9, 2011 22:59 by stakisko
Updated Code
/*
* dijkstra.c
*
* Created on: Nov 4, 2011
* Author: kostas
*/
/*
#include <stdio.h>
#include <stdlib.h>
typedef struct _node node;
typedef struct _acne acne;
/*
* There are two structures.
* 'Node' represent each node having childrens acnes represent each connected to him nodes.
* 'Acne' represent each acne connecting two Nodes.
*/
struct _node {
int distance; // distance from the first node
struct _acne *children[100]; // going to nodes
int edgeno; // how many nodes are connected to
int name;
};
struct _acne {
int value; // distance between these edges
int from; // acne connecting from
int to; // to
struct _node *edge;
};
/*
* for every node we are going in (the parameter) we search its connected childs nodes and
* calculate their distances. then we are going in again( recursion ) in the node with the
* minimum distance
*
* */
int traverse(struct _node *node){
if(node->edgeno<=0)
return 0;
printf("start of node %d\n", node->name);
printf("\tchildrens: %d\n", node->edgeno);
int mindistance = node->children[0]->value;
int minnode = 0;
int i;
for(i=0;i<node->edgeno; i++){
if(node->distance + node->children[i]->value < node->children[i]->edge->distance ){
node->children[i]->edge->distance = node->distance + node->children[i]->value;
}
if (mindistance > node->children[i]->edge->distance){
mindistance = node->children[i]->edge->distance;
minnode = i;
}
printf("\tfrom %d to %d with distance %d\n", node->children[i]->from, node->children[i]->to, node->children[i]->edge->distance);
}
printf("\tmin node %d\n", node->children[minnode]->to);
printf("end of node\n-----------------------\n");
traverse(node->children[minnode]->edge);
return 0;
}
// main function
int main(int argc, char *argv[]){
FILE *ifp;
int t, t1, t2;
int nodesNo = 0;
int edgesNo = 0;
ifp = fopen("/home/kostas/Downloads/dijkstra1.dat", "r");
if (ifp == NULL) {
fprintf(stderr, "Can't open input file dijkstra.dat!\n");
exit(1);
}
fscanf(ifp, "%d %d", &nodesNo, &edgesNo);
struct _node nodes[nodesNo];
struct _acne acnes[edgesNo];
int i = 0; // count the acnes
int previous = 0;
int k = 0; // count childs for every node
/*
* Files content should be in the format
* n N
* startNode endNode distance
* startNode endNode distance
* .
* .
* .
* startNode endNode distance
*
* where n is the total number of Nodes and N is the total number of Acnes
*
*/
while(fscanf(ifp, "%d %d %d", &t, &t1, &t2) == 3){ /* read from file */
/*
* Then for every line we create a node and also
* an acne to place the connected edges.
*
*/
if(previous != t)
k = 0;
nodes[t].distance = 65000; // infinite
nodes[t].name = t;
acnes[i].from = t;
acnes[i].to = t1;
acnes[i].value = t2;
acnes[i].edge = &nodes[t1];
nodes[t].children[k] = &acnes[i];
nodes[t].edgeno = k+1;
i++;
k++;
previous = t;
}
// set firsts node's distance
nodes[0].distance = 0;
// set last node
nodes[nodesNo-1].distance = 65000;
nodes[nodesNo-1].edgeno = 0;
int j;
for(j=0; j< (sizeof(nodes)/sizeof(*nodes));j++)
printf("node %d, distance %d, edgeno %d\n", nodes[j].name, nodes[j].distance, nodes[j].edgeno);
for(j=0; j< sizeof(acnes)/sizeof(*acnes);j++)
printf("from %d, to %d, value %d\n", acnes[j].from, acnes[j].edge->name, acnes[j].value);
printf("\n-----------\n");
traverse(&nodes[0]);
printf("\n-----------\n");
for(j=0; j< (sizeof(nodes)/sizeof(*nodes));j++)
printf("nnode %d, distance %d\n", nodes[j].name, nodes[j].distance);
return 0;
}
Revision: 53002
Updated Code
at November 9, 2011 22:38 by stakisko
Updated Code
/*
* dijkstra.c
*
* Created on: Nov 4, 2011
* Author: kostas
*/
/*
#include <stdio.h>
#include <stdlib.h>
typedef struct _node node;
typedef struct _acne acne;
/*
* There are two structures.
* 'Node' represent each node having childrens acnes represent each connected to him nodes.
* 'Acne' represent each acne connecting two Nodes.
*/
struct _node {
int distance; // distance from the first node
struct _acne *children[100]; // going to nodes
int edgeno; // how many nodes are connected to
int name;
};
struct _acne {
int value; // distance between these edges
int from; // acne connecting from
int to; // to
struct _node *edge;
};
/*
* for every node we are going in (the parameter) we search its connected childs nodes and
* calculate their distances. then we are going in again( recursion ) in the node with the
* minimum distance
*
* */
int traverse(struct _node *node){
if(node->edgeno<=0)
return 0;
printf("start of node %d\n", node->name);
printf("\tchildrens: %d\n", node->edgeno);
int mindistance = node->children[0]->value;
int minnode = 0;
int i;
for(i=0;i<node->edgeno; i++){
if(node->distance + node->children[i]->value < node->children[i]->edge->distance ){
node->children[i]->edge->distance = node->distance + node->children[i]->value;
}
if (mindistance > node->children[i]->edge->distance){
mindistance = node->children[i]->edge->distance;
minnode = i;
}
printf("\tfrom %d to %d with distance %d\n", node->children[i]->from, node->children[i]->to, node->children[i]->edge->distance);
}
printf("\tmin node %d\n", node->children[minnode]->to);
printf("end of node\n-----------------------\n");
traverse(node->children[minnode]->edge);
return 0;
}
// main function
int main(int argc, char *argv[]){
FILE *ifp;
int t, t1, t2;
int nodesNo = 0;
int edgesNo = 0;
ifp = fopen("/home/kostas/Downloads/dijkstra1.dat", "r");
if (ifp == NULL) {
fprintf(stderr, "Can't open input file dijkstra.dat!\n");
exit(1);
}
fscanf(ifp, "%d %d", &nodesNo, &edgesNo);
struct _node nodes[nodesNo];
struct _acne acnes[edgesNo];
int i = 0; // count the acnes
int previous = 0;
int k = 0; // count childs for every node
/*
* Files content should be in the format
* n N
* startNode endNode distance
* startNode endNode distance
* .
* .
* .
* startNode endNode distance
*
* where n is the total number of Nodes and N is the total number of Acnes
*
*/
while(fscanf(ifp, "%d %d %d", &t, &t1, &t2) == 3){ /* read from file */
/*
* Then for every line we create a node and also
* an acne to place the connected edges.
*
*/
if(previous != t)
k = 0;
nodes[t].distance = 65000; // infinite
nodes[t].name = t;
acnes[i].from = t;
acnes[i].to = t1;
acnes[i].value = t2;
acnes[i].edge = &nodes[t1];
nodes[t].children[k] = &acnes[i];
nodes[t].edgeno = k+1;
i++;
k++;
previous = t;
}
// set firsts node's distance
nodes[0].distance = 0;
// set last node
nodes[nodesNo-1].distance = 65000;
nodes[nodesNo-1].edgeno = 0;
nodes[nodesNo-1].name = 5;
int j;
for(j=0; j< (sizeof(nodes)/sizeof(*nodes));j++)
printf("node %d, distance %d, edgeno %d\n", nodes[j].name, nodes[j].distance, nodes[j].edgeno);
for(j=0; j< sizeof(acnes)/sizeof(*acnes);j++)
printf("from %d, to %d, value %d\n", acnes[j].from, acnes[j].edge->name, acnes[j].value);
printf("\n-----------\n");
traverse(&nodes[0]);
printf("\n-----------\n");
for(j=0; j< (sizeof(nodes)/sizeof(*nodes));j++)
printf("nnode %d, distance %d\n", nodes[j].name, nodes[j].distance);
return 0;
}
Revision: 53001
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at November 9, 2011 22:37 by stakisko
Initial Code
/*
* dikstra.c
*
* Created on: Nov 4, 2011
* Author: kostas
*/
/*
#include <stdio.h>
#include <stdlib.h>
typedef struct _node node;
typedef struct _acne acne;
/*
* There are two structures.
* 'Node' represent each node having childrens acnes represent each connected to him nodes.
* 'Acne' represent each acne connecting two Nodes.
*/
struct _node {
int distance; // distance from the first node
struct _acne *children[100]; // going to nodes
int edgeno; // how many nodes are connected to
int name;
};
struct _acne {
int value; // distance between these edges
int from; // acne connecting from
int to; // to
struct _node *edge;
};
/*
* for every node we are going in (the parameter) we search its connected childs nodes and
* calculate their distances. then we are going in again( recursion ) in the node with the
* minimum distance
*
* */
int traverse(struct _node *node){
if(node->edgeno<=0)
return 0;
printf("start of node %d\n", node->name);
printf("\tchildrens: %d\n", node->edgeno);
int mindistance = node->children[0]->value;
int minnode = 0;
int i;
for(i=0;i<node->edgeno; i++){
if(node->distance + node->children[i]->value < node->children[i]->edge->distance ){
node->children[i]->edge->distance = node->distance + node->children[i]->value;
}
if (mindistance > node->children[i]->edge->distance){
mindistance = node->children[i]->edge->distance;
minnode = i;
}
printf("\tfrom %d to %d with distance %d\n", node->children[i]->from, node->children[i]->to, node->children[i]->edge->distance);
}
printf("\tmin node %d\n", node->children[minnode]->to);
printf("end of node\n-----------------------\n");
traverse(node->children[minnode]->edge);
return 0;
}
// main function
int main(int argc, char *argv[]){
FILE *ifp;
int t, t1, t2;
int nodesNo = 0;
int edgesNo = 0;
ifp = fopen("/home/kostas/Downloads/dijkstra1.dat", "r");
if (ifp == NULL) {
fprintf(stderr, "Can't open input file dijkstra.dat!\n");
exit(1);
}
fscanf(ifp, "%d %d", &nodesNo, &edgesNo);
struct _node nodes[nodesNo];
struct _acne acnes[edgesNo];
int i = 0; // count the acnes
int previous = 0;
int k = 0; // count childs for every node
/*
* Files content should be in the format
* n N
* startNode endNode distance
* startNode endNode distance
* .
* .
* .
* startNode endNode distance
*
* where n is the total number of Nodes and N is the total number of Acnes
*
*/
while(fscanf(ifp, "%d %d %d", &t, &t1, &t2) == 3){ /* read from file */
/*
* Then for every line we create a node and also
* an acne to place the connected edges.
*
*/
if(previous != t)
k = 0;
nodes[t].distance = 65000; // infinite
nodes[t].name = t;
acnes[i].from = t;
acnes[i].to = t1;
acnes[i].value = t2;
acnes[i].edge = &nodes[t1];
nodes[t].children[k] = &acnes[i];
nodes[t].edgeno = k+1;
i++;
k++;
previous = t;
}
// set firsts node's distance
nodes[0].distance = 0;
// set last node
nodes[nodesNo-1].distance = 65000;
nodes[nodesNo-1].edgeno = 0;
nodes[nodesNo-1].name = 5;
int j;
for(j=0; j< (sizeof(nodes)/sizeof(*nodes));j++)
printf("node %d, distance %d, edgeno %d\n", nodes[j].name, nodes[j].distance, nodes[j].edgeno);
for(j=0; j< sizeof(acnes)/sizeof(*acnes);j++)
printf("from %d, to %d, value %d\n", acnes[j].from, acnes[j].edge->name, acnes[j].value);
printf("\n-----------\n");
traverse(&nodes[0]);
printf("\n-----------\n");
for(j=0; j< (sizeof(nodes)/sizeof(*nodes));j++)
printf("nnode %d, distance %d\n", nodes[j].name, nodes[j].distance);
return 0;
}
Initial URL
Initial Description
Its Dijkstra's Shortest Path algorithm written in C. Reads from a file the nodes and the connected edges and implements Dijkstra's algorithm. I am uploading for your comments in my code. Thank you. <p>Files content should be in the format: n N startNode endNode distance startNode endNode distance . . . startNode endNode distance </p> <p>where n is the total number of Nodes and N is the total number of Acnes.</p>
Initial Title
Dijkstra\'s Shortest Path algorithm
Initial Tags
path
Initial Language
C