/* Single Source Shortest Paths */
#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 100 /* maximum length of input line */
//#define SIZE 8
char line[MAXLINE]; /* stores next input line */
int n, m; /* number of nodes, number of edges */
/* adjacency lists of input graph */
typedef struct node *link; /* pointer to adjacency list node */
struct node { int id; int weight; link next; }; /* adjacency list node */
link *adj; /* node array */
int *D;
/* priority queue */
/* ... insert your code ... */
void Queue(int j){
int i;
D
= (int *)malloc(n
*sizeof(D
));for (i=0; i<j; i++)
{
D[i]=9999; //9999 stands for infinite
}
}
/* ... end of code ... */
/* initialization of array adj */
void init(int N)
{
int i;
adj
= (link
*) malloc(N
*sizeof(link
)); for (i=0; i<N; i++)
{
adj[i]=NULL;
}
}
/* create new list node */
link NEW(int v, int w, link next)
{
link x
= (link
) malloc(sizeof(link
)); x->id = v;
x->weight = w;
x->next = next;
return x;
}
/* print all adjacency lists of the graph */
void printGraph()
{
link x;
int i;
printf("Printing adjacency lists\n"); for (i=1; i<=n; i++)
{
x = adj[i];
while (x != NULL)
{
printf("%d[%d] ", x
->id
, x
->weight
); x=x->next;
}
}
}
/* read graph from input file */
void readGraph(const char *file)
{
FILE
*input
= fopen (file
, "r"); if (!input)
{
fprintf (stderr
, "Error opening file \"%s\".\n", file
); }
int x, y, w;
while ( fgets (line
, MAXLINE
, input
) != NULL
) {
switch (line[0])
{
case '\n': ; /* ignore emplty lines */
case '\0': break; /* ignore empty lines at the end of file */
case 'p' : /* read problem parameters: number of nodes, number of edges */
if (sscanf (line
, "p %d %d", &n
, &m
) != 2) {
fprintf (stderr
, "Error reading graph size (%s).\n", file
); }
init(n+1); /* initialize structures */
break;
case 'a' : /* read next edge */
if (sscanf (line
, "a %d %d %d", &x
, &y
, &w
)!=3) {
fprintf (stderr
, "Error reading graph (%s).\n", file
); }
adj[x] = NEW(y, w, adj[x]); /* add edge (x,y) with weight w */
break;
default: fprintf (stderr
, "Error reading graph (%s).\n", file
); }
}
}
/*void Relax()
{
D[p]=q;
if (D[p]>)
}
*/
/* Dijkstra's algorithm */
void Dijkstra(int k)
{
Queue(n+1);
D[k]=0;
int di, done[n+1], pi[n+1]; // done[] array includes already examined nodes. pi[]array is the predecessor array for implementing Dijkstra's algorithm
for (di=0; di<n+1; di++)
{
done[di]=-2; //initialize done[] elements with -2.
pi[di]=-1; //initialize pi[] elements with -1 (void).
}
done[1]=0;//initialize 1st element to be 0
pi[1]=0;//initialize 1st element to be 0
int i, fl=1, p, q, dp, m=D[1]; // Var i is for the for-loop counter, dp is for the done[] array
//int flag=0;
for (i=1; i<=n; i++){
while ( fl != n )
{
//Find node with min weight. The value -1 means that the node is "done".
for (i=1; i <= n; i++)
{
if (D[i] <= m && D[i] != -1 && D[i] != 9999) {
m = D[i];
dp = i;}
}
//Updating queues
done[dp] = 1; //1 means that the node "dp" has been successfully examined
D[dp] = -1;
//Add neighbours of node we are currently examining
link x;
x=adj[dp];
while (x != NULL)
{
p = x->id;
q = x->weight;
D[p]=q;
x=x->next;
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>PROVLIMATIKOS KODIKAS>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//We have to relax the edges now...
for (i=1; i<n; i++){
int w;
link tmp;
tmp=adj[dp];
//This while-loop is useful in order to determine the edge (if any) between the current node (dp) and the node running by the for-loop (i)
while (tmp != NULL)
{
p = tmp->id;
q = tmp->weight;
tmp=tmp->next;
if (p==i) {w=q;}
else{
if (tmp == NULL){
w=0;
break;
}
}
}//close while
if ((D[i] > D[dp] + w) && D[i]!=9999 && D[i] !=-1 ){
D[i] = D[dp] + w;
pi[i]=dp;
}//close if
}//close for
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TELOS PROVLIMATIKOU TMIMATOS>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//Prevent the minimum search routine from including -1 values in search
int el;
for(el=1; el<n-1; el++){
if (D[dp+el] != -1 && (dp+el)<n){
m = D[dp+el];}
}
//Print done[] (NOT NECESSARY)
int cnt;
for (cnt
=1; cnt
<=n
; cnt
++){printf("%d \n", pi
[cnt
]);}//<< printf("====================================================\n");
//Check whether the priority queue (D) is "empty"
while(D[fl]==-1){fl++;}
if (fl==n+1){break;}
}//while close
}//for close
}//Dijkstra close
int main(int argc, char *argv[])
{
int i;
if (argc != 2)
{
printf("\n usage: %s <input file> \n\n", argv
[0]); return 0;
}
char *file = argv[1];
readGraph(file);
//printGraph();
Dijkstra(1);
return 0;
}
LyogU2luZ2xlIFNvdXJjZSBTaG9ydGVzdCBQYXRocyAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUgTUFYTElORSAgICAgICAxMDAgICAvKiBtYXhpbXVtIGxlbmd0aCBvZiBpbnB1dCBsaW5lICAqLwovLyNkZWZpbmUgU0laRSAgICAgICAgICA4CmNoYXIgbGluZVtNQVhMSU5FXTsgICAgICAgICAvKiBzdG9yZXMgbmV4dCBpbnB1dCBsaW5lICovCgppbnQgbiwgbTsgICAgIC8qIG51bWJlciBvZiBub2RlcywgbnVtYmVyIG9mIGVkZ2VzICovCgovKiBhZGphY2VuY3kgbGlzdHMgb2YgaW5wdXQgZ3JhcGggKi8gCnR5cGVkZWYgc3RydWN0IG5vZGUgKmxpbms7IC8qIHBvaW50ZXIgdG8gYWRqYWNlbmN5IGxpc3Qgbm9kZSAqLwpzdHJ1Y3Qgbm9kZSB7IGludCBpZDsgaW50IHdlaWdodDsgbGluayBuZXh0OyB9OyAvKiBhZGphY2VuY3kgbGlzdCBub2RlICovCmxpbmsgKmFkajsgIC8qIG5vZGUgYXJyYXkgKi8KaW50ICpEOwovKiBwcmlvcml0eSBxdWV1ZSAqLwoKLyogLi4uIGluc2VydCB5b3VyIGNvZGUgLi4uICovCgp2b2lkIFF1ZXVlKGludCBqKXsgCgppbnQgaTsKRCA9IChpbnQgKiltYWxsb2MobipzaXplb2YoRCkpOwpmb3IgKGk9MDsgaTxqOyBpKyspCiAgICB7CiAgICAgICAgRFtpXT05OTk5OyAvLzk5OTkgc3RhbmRzIGZvciBpbmZpbml0ZQogICAgfQp9CgoKLyogLi4uIGVuZCBvZiBjb2RlIC4uLiAqLwoKCi8qIGluaXRpYWxpemF0aW9uIG9mIGFycmF5IGFkaiAqLwp2b2lkIGluaXQoaW50IE4pCnsKICAgIGludCBpOwogICAKICAgIGFkaiA9IChsaW5rICopIG1hbGxvYyhOKnNpemVvZihsaW5rKSk7CiAgICBmb3IgKGk9MDsgaTxOOyBpKyspCiAgICB7CiAgICAgICAgYWRqW2ldPU5VTEw7CiAgICB9Cn0KCgovKiBjcmVhdGUgbmV3IGxpc3Qgbm9kZSAqLwpsaW5rIE5FVyhpbnQgdiwgaW50IHcsIGxpbmsgbmV4dCkKewkKICAgIGxpbmsgeCA9IChsaW5rKSBtYWxsb2Moc2l6ZW9mKGxpbmspKTsKICAgIHgtPmlkID0gdjsgCiAgICB4LT53ZWlnaHQgPSB3OwogICAgeC0+bmV4dCA9IG5leHQ7CiAgICByZXR1cm4geDsJCn0KCgovKiBwcmludCBhbGwgYWRqYWNlbmN5IGxpc3RzIG9mIHRoZSBncmFwaCAqLwp2b2lkIHByaW50R3JhcGgoKQp7CiAgICBsaW5rIHg7CiAgICBpbnQgaTsKICAgIAogICAgcHJpbnRmKCJQcmludGluZyBhZGphY2VuY3kgbGlzdHNcbiIpOwogICAgZm9yIChpPTE7IGk8PW47IGkrKykKICAgIHsKICAgICAgICBwcmludGYoIm5vZGUgJWQgOiAiLCBpKTsKICAgICAgICB4ID0gYWRqW2ldOwogICAgICAgIHdoaWxlICh4ICE9IE5VTEwpCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIiVkWyVkXSAiLCB4LT5pZCwgeC0+d2VpZ2h0KTsKICAgICAgICAgICAgeD14LT5uZXh0OwogICAgICAgIH0KICAgICAgICBwcmludGYoIlxuIik7CiAgICB9Cn0KCgovKiByZWFkIGdyYXBoIGZyb20gaW5wdXQgZmlsZSAqLwp2b2lkIHJlYWRHcmFwaChjb25zdCBjaGFyICpmaWxlKSAKewogICAgICAgIEZJTEUgKmlucHV0ID0gZm9wZW4gKGZpbGUsICJyIik7CglpZiAoIWlucHV0KSAKICAgICAgICB7CgkJZnByaW50ZiAoc3RkZXJyLCAiRXJyb3Igb3BlbmluZyBmaWxlIFwiJXNcIi5cbiIsIGZpbGUpOwoJCWV4aXQoLTEpOwoJfQoJCiAgICAgICAgaW50IHgsIHksIHc7CgkKCXdoaWxlICggZmdldHMgKGxpbmUsIE1BWExJTkUsIGlucHV0KSAhPSBOVUxMICkKCXsKCQlzd2l0Y2ggKGxpbmVbMF0pCgkJewogICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzogIDsgICAgICAgICAgICAgICAgLyogaWdub3JlIGVtcGx0eSBsaW5lcyAqLwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ1wwJzogIGJyZWFrOyAgICAgICAgICAgLyogaWdub3JlIGVtcHR5IGxpbmVzIGF0IHRoZSBlbmQgb2YgZmlsZSAqLwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3AnIDogIC8qIHJlYWQgcHJvYmxlbSBwYXJhbWV0ZXJzOiBudW1iZXIgb2Ygbm9kZXMsIG51bWJlciBvZiBlZGdlcyAqLyAgICAgICAgCgkJCQlpZiAoc3NjYW5mIChsaW5lLCAicCAlZCAlZCIsICZuLCAmbSkgIT0gMikKCQkJCXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgcmVhZGluZyBncmFwaCBzaXplICglcykuXG4iLCBmaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgtMSk7CgkJCQl9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdChuKzEpOyAvKiBpbml0aWFsaXplIHN0cnVjdHVyZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdhJyA6ICAvKiByZWFkIG5leHQgZWRnZSAqLwoJCQkJaWYgKHNzY2FuZiAobGluZSwgImEgJWQgJWQgJWQiLCAmeCwgJnksICZ3KSE9MykgCgkJCQl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIHJlYWRpbmcgZ3JhcGggKCVzKS5cbiIsIGZpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0KC0xKTsKCQkJCX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGpbeF0gPSBORVcoeSwgdywgYWRqW3hdKTsgLyogYWRkIGVkZ2UgKHgseSkgd2l0aCB3ZWlnaHQgdyAqLwoJCQkJYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgcmVhZGluZyBncmFwaCAoJXMpLlxuIiwgZmlsZSk7CgkJCQlleGl0KC0xKTsKCQl9Cgl9CgkKCWZjbG9zZSAoaW5wdXQpOwp9CgoKCi8qdm9pZCBSZWxheCgpCnsKRFtwXT1xOwppZiAoRFtwXT4pCn0KKi8KCi8qIERpamtzdHJhJ3MgYWxnb3JpdGhtICAqLwp2b2lkIERpamtzdHJhKGludCBrKQp7ClF1ZXVlKG4rMSk7CkRba109MDsKaW50IGRpLCBkb25lW24rMV0sIHBpW24rMV07IC8vIGRvbmVbXSBhcnJheSBpbmNsdWRlcyBhbHJlYWR5IGV4YW1pbmVkIG5vZGVzLiBwaVtdYXJyYXkgaXMgdGhlIHByZWRlY2Vzc29yIGFycmF5IGZvciBpbXBsZW1lbnRpbmcgRGlqa3N0cmEncyBhbGdvcml0aG0KZm9yIChkaT0wOyBkaTxuKzE7IGRpKyspCiAgICB7Cglkb25lW2RpXT0tMjsgLy9pbml0aWFsaXplIGRvbmVbXSBlbGVtZW50cyB3aXRoIC0yLgoJcGlbZGldPS0xOyAvL2luaXRpYWxpemUgcGlbXSBlbGVtZW50cyB3aXRoIC0xICh2b2lkKS4KICAgIH0KZG9uZVsxXT0wOy8vaW5pdGlhbGl6ZSAxc3QgZWxlbWVudCB0byBiZSAwCnBpWzFdPTA7Ly9pbml0aWFsaXplIDFzdCBlbGVtZW50IHRvIGJlIDAKCmludCBpLCBmbD0xLCBwLCBxLCBkcCwgbT1EWzFdOyAvLyBWYXIgaSBpcyBmb3IgdGhlIGZvci1sb29wIGNvdW50ZXIsIGRwIGlzIGZvciB0aGUgZG9uZVtdIGFycmF5IAovL2ludCBmbGFnPTA7CmZvciAoaT0xOyBpPD1uOyBpKyspewogIHdoaWxlICggZmwgIT0gbiApCgl7IAoJCS8vRmluZCBub2RlIHdpdGggbWluIHdlaWdodC4gVGhlIHZhbHVlIC0xIG1lYW5zIHRoYXQgdGhlIG5vZGUgaXMgImRvbmUiLgoJCWZvciAoaT0xOyBpIDw9IG47IGkrKykKCQl7CiAgICAgIAkJICBpZiAoRFtpXSA8PSBtICYmIERbaV0gIT0gLTEgJiYgRFtpXSAhPSA5OTk5KSB7IAoJCSAgbSA9IERbaV07CgkJICBkcCA9IGk7fQoJCX0KCQkKCQkvL1VwZGF0aW5nIHF1ZXVlcwkKCQlkb25lW2RwXSA9IDE7IC8vMSBtZWFucyB0aGF0IHRoZSBub2RlICJkcCIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGV4YW1pbmVkCgkJRFtkcF0gPSAtMTsKCQkKCQkvL0FkZCBuZWlnaGJvdXJzIG9mIG5vZGUgd2UgYXJlIGN1cnJlbnRseSBleGFtaW5pbmcKCQkJCQkJCgkJbGluayB4OwoJCXg9YWRqW2RwXTsKCgkJd2hpbGUgKHggIT0gTlVMTCkKICAgICAgICAJewoJCSAgcCA9IHgtPmlkOwoJCSAgcSA9IHgtPndlaWdodDsKCQkgIERbcF09cTsKCQkgIHg9eC0+bmV4dDsgCiAgICAgICAJfQovLz4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+UFJPVkxJTUFUSUtPUyBLT0RJS0FTPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PgovL1dlIGhhdmUgdG8gcmVsYXggdGhlIGVkZ2VzIG5vdy4uLgpmb3IgKGk9MTsgaTxuOyBpKyspewoJaW50IHc7CglsaW5rIHRtcDsKCXRtcD1hZGpbZHBdOwkKCQoJLy9UaGlzIHdoaWxlLWxvb3AgaXMgdXNlZnVsIGluIG9yZGVyIHRvIGRldGVybWluZSB0aGUgZWRnZSAoaWYgYW55KSBiZXR3ZWVuIHRoZSBjdXJyZW50IG5vZGUgKGRwKSBhbmQgdGhlIG5vZGUgcnVubmluZyBieSB0aGUgZm9yLWxvb3AgKGkpCgl3aGlsZSAodG1wICE9IE5VTEwpCiAgICAgICAgCXsKCQkgIHAgPSB0bXAtPmlkOwoJCSAgcSA9IHRtcC0+d2VpZ2h0OwoJCSAgdG1wPXRtcC0+bmV4dDsKCQkgIGlmIChwPT1pKSB7dz1xO30KCQkgIGVsc2V7CgkJICAJaWYgKHRtcCA9PSBOVUxMKXsKCQkJICB3PTA7CQkJCgkJCSAgYnJlYWs7CgkJCX0KCQkgIH0KICAgICAgICAJfS8vY2xvc2Ugd2hpbGUKCglpZiAoKERbaV0gPiBEW2RwXSArIHcpICYmIERbaV0hPTk5OTkgJiYgRFtpXSAhPS0xICl7CgkJRFtpXSA9IERbZHBdICsgdzsKCQlwaVtpXT1kcDsKCgl9Ly9jbG9zZSBpZgp9Ly9jbG9zZSBmb3IKLy8+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj5URUxPUyBQUk9WTElNQVRJS09VIFRNSU1BVE9TPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PgoJCS8vUHJldmVudCB0aGUgbWluaW11bSBzZWFyY2ggcm91dGluZSBmcm9tIGluY2x1ZGluZyAtMSB2YWx1ZXMgaW4gc2VhcmNoCgkJaW50IGVsOwoJCWZvcihlbD0xOyBlbDxuLTE7IGVsKyspewoJCQlpZiAoRFtkcCtlbF0gIT0gLTEgJiYgKGRwK2VsKTxuKXsJCQoJCQkJbSA9IERbZHArZWxdO30KCQl9CgoJCS8vUHJpbnQgZG9uZVtdIChOT1QgTkVDRVNTQVJZKQoJCWludCBjbnQ7CQoJCWZvciAoY250PTE7IGNudCA8PW47IGNudCsrKXtwcmludGYoIiVkIFxuIiwgcGlbY250XSk7fS8vPDwKCQlwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwoJCQoJCS8vQ2hlY2sgd2hldGhlciB0aGUgcHJpb3JpdHkgcXVldWUgKEQpIGlzICJlbXB0eSIJCQoJCXdoaWxlKERbZmxdPT0tMSl7ZmwrKzt9CgkJaWYgKGZsPT1uKzEpe2JyZWFrO30KCgl9Ly93aGlsZSBjbG9zZQoJCQogICB9Ly9mb3IgY2xvc2UKCn0vL0RpamtzdHJhIGNsb3NlCgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7ICAgCiAgICBpbnQgaTsKICAgIGlmIChhcmdjICE9IDIpIAogICAgewoJcHJpbnRmKCJcbiB1c2FnZTogJXMgPGlucHV0IGZpbGU+IFxuXG4iLCBhcmd2WzBdKTsKCXJldHVybiAwOwogICAgfQogICAgCiAgICBjaGFyICpmaWxlID0gYXJndlsxXTsKICAgIHJlYWRHcmFwaChmaWxlKTsgCiAgICAKICAgIC8vcHJpbnRHcmFwaCgpOyAKICAgICAgIAogICAgRGlqa3N0cmEoMSk7CiAgICAKICAgIHJldHVybiAwOwp9