Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include "config/compiler.h"
00038 #include "include/global.h"
00039 #define DIJ_INFINITY 10000
00040
00041 static int n;
00042 static long **dist;
00043 static long *d;
00044 static int *prev;
00045 static int *visited;
00046
00047 void dijkstra(int s) {
00048 int i, k, mini;
00049
00050 for (i = 0; i < n; ++i) {
00051 d[i] = DIJ_INFINITY;
00052 prev[i] = -1;
00053 visited[i] = 0;
00054 }
00055
00056 d[s] = 0;
00057
00058 for (k = 0; k < n; ++k) {
00059 mini = -1;
00060 for (i = 0; i < n; ++i)
00061 if (!visited[i] && ((mini == -1) || (d[i] < d[mini])))
00062 mini = i;
00063
00064 visited[mini] = 1;
00065
00066 for (i = 0; i < n; ++i)
00067 if (dist[mini][i])
00068 if (d[mini] + dist[mini][i] < d[i]) {
00069 d[i] = d[mini] + dist[mini][i];
00070 prev[i] = mini;
00071 }
00072 }
00073 }
00074
00075 void dij_init(int matrix_size) {
00076
00077 int i;
00078 n = matrix_size;
00079 dist= (long**) MALLOC(n*sizeof(long*));
00080 for (i=0;i<n;i++){
00081 dist[i]=(long *) MALLOC(n*sizeof(long));
00082 }
00083 d=(long *) MALLOC(n*sizeof(long));
00084 prev=(int *) MALLOC(n*sizeof(long));
00085 visited=(int *) MALLOC(n*sizeof(int));
00086 }
00087
00088 void dij_free (void) {
00089 int i;
00090
00091 for (i=0;i<n;i++){
00092 FREE(dist[i]);
00093 }
00094 FREE(dist);
00095 FREE(d);
00096 FREE(prev);
00097 FREE(visited);
00098 }
00099
00100 static int check_range(int i, int j){
00101 if (i >= 0 && i < status.N_NODES && j >= 0 && j < status.N_NODES){
00102 return 1;
00103 }else{
00104 return 0;
00105 }
00106 }
00107
00108 long ** dij_get_ptr(void){
00109 return dist;
00110 }
00111
00112 void dij_set(int i, int j, long val) {
00113 if (check_range(i,j)){
00114 dist[i][j] = val;
00115 }
00116 }
00117 long dij_get(int i, int j) {
00118 if (check_range(i,j)){
00119 return dist[i][j];
00120 } else{
00121 return -1;
00122 }
00123 }
00124
00125
00126 int dij_getPath(int src, int dest, char* path) {
00127 int idx = 0, j = 0;
00128 if (!check_range(src,dest)){
00129 return -1;
00130 }
00131 dijkstra(src);
00132 if (d[dest] == DIJ_INFINITY) {
00133 WMP_DBG(DIJKSTRA,"No PATH");
00134 return -1;
00135 }
00136 while (prev[dest] != -1) {
00137 path[idx] = dest;
00138 idx = idx + 1;
00139 dest = prev[dest];
00140 }
00141 path[idx] = dest;
00142
00143 for (j = 0; j <= idx / 2; j++) {
00144 int a = path[j];
00145 path[j] = path[idx - j];
00146 path[idx - j] = a;
00147
00148 }
00149 return idx;
00150 }
00151
00152 int dij_getDist(int src, int dest) {
00153 if (!check_range(src,dest)){
00154 return -1;
00155 }
00156 dijkstra(src);
00157 return d[dest];
00158 }
00159
00160
00161
00162
00163 int dij_isConnected(void) {
00164 int i=0, connected=1;
00165 dijkstra(0);
00166 for (i=0; i<n; i++){
00167 connected = connected && (d[i]<DIJ_INFINITY);
00168 }
00169 return connected;
00170 }
00171
00172 int dij_isIsolated(int src) {
00173
00174
00175
00176
00177
00178 if (!check_range(src,src)){
00179 return 1;
00180 }
00181 dijkstra(status.id);
00182 return (d[src] == DIJ_INFINITY);
00183 }
00184
00185
00186
00187 int dij_isIsolated2(int src) {
00188 dijkstra(src);
00189 return (d[status.id] == DIJ_INFINITY);
00190 }
00191
00192
00193
00194