/* dijkstra2.c --- ダイクストラ法第2ステップ */ #include #include #include #define CrossingNumber 100 /* 交差点数=100 */ #define MaxName 50 /* 最大文字数50文字(半角) */ typedef struct { double x, y; /* 位置 x, y */ } Position; /* 位置を表す構造体 */ typedef struct { int id; /* 交差点番号 */ Position pos; /* 位置を表す構造体 */ double wait; /* 平均待ち時間 */ char jname[MaxName]; /* 交差点名 */ char ename[MaxName]; /* 交差点名 */ int points; /* 交差道路数 */ int next[5]; /* 隣接する交差点番号 */ double distance; /* 基準交差点からのトータル距離:追加 */ int previous; /* 基準交差点からの経路(直前の交差点番号):追加 */ } Crossing; Crossing cross[CrossingNumber]; int map_read(char *filename) { FILE *fp; int i, j; int crossing_number; /* 交差点数 */ fp = fopen(filename, "r"); if (fp == NULL) { printf("File %s is not created\n", filename); return 0; } /* はじめに交差点数を読み込む */ fscanf(fp, "%d", &crossing_number); if((crossing_number<1)|| (crossing_number>=CrossingNumber)) { printf("Illegal data number (%d)\n", crossing_number); return 0; } for (i = 0; i < crossing_number; i++) { fscanf(fp, "%d,%lf,%lf,%lf,%[^,],%[^,],%d", &(cross[i].id), &(cross[i].pos.x), &(cross[i].pos.y), &(cross[i].wait), cross[i].jname, cross[i].ename, &(cross[i].points)); for(j=0; j"); scanf("%s",input); puts(""); for(i=0;i d) { cross[n].distance = d; cross[n].previous = min_cross; } } } } /* 最短パス設定 */ int pickup_path(int crossing_number,int start,int goal, int path[],int maxpath) { int c=start; /* 現在いる交差点 */ int i; path[0]=start; i=1; c=start; /* 現在値を start に設定 */ while(c!=goal) { c=cross[c].previous; path[i]=c; i++; } path[i]=-1; /* おしまいのマーク */ return 0; } int main(void) { int crossing_number; /* 交差点数 */ int goal,start; int path[20]; int i; /* ファイルの読み込み */ crossing_number = map_read("map2.dat"); printf("loaded %d crossings\n",crossing_number); for(i=0;i=0) { printf("%2d %5.1lf %s\n", i+1,cross[path[i]].distance,cross[path[i]].jname); i++; } return 0; }