示例#1
0
int floyd_warshall(int * map, int vertex_num)
{
	int i,j,k;
	int max_path_len=128;
	int dis[vertex_num*vertex_num];
	char *path[vertex_num*vertex_num];
	
	init_dis_from_map(dis,map,vertex_num);
	malloc_path(path,max_path_len,vertex_num);
	init_path(path,max_path_len,vertex_num);

	for(k=0; k < vertex_num; k++)
	{	
		for(i = 0; i < vertex_num; i++)
		{
			for(j = 0; j < vertex_num; j++)
			{
				if(dis[i*vertex_num+j] > dis[i*vertex_num+k] + dis[k*vertex_num +j] )
				{
					dis[i*vertex_num+j] = dis[i*vertex_num+k] + dis[k*vertex_num +j];
					snprintf(path[i*vertex_num +j],max_path_len,"%s,%s",path[i*vertex_num+k],path[k*vertex_num + j]);
				}
			}
		}
	}
	
	printf("the floyd-warrshall result: \n");
	print_distance(dis,vertex_num);
	printf("the path result is \n");
	print_path(path,vertex_num);

	destroy_path(path,vertex_num);
	return OK;
}
示例#2
0
int main(int argc, char *argv[])
{
	FILE *fp;
	fp = fopen("brand.dat", "rt");

	fscanf(fp, "%d", &max_dist);
	fscanf(fp, "%d", &ntowns);
	rewind(fp);
	fclose(fp);

	distance = malloc(ntowns * sizeof(int *));
	fire_dept = malloc(ntowns * sizeof(int));
	int i;
	for (i = 0; i < ntowns; i += 1)
		fire_dept[i] = EMPTY;

	for (i = 0; i < ntowns; i += 1)
		distance[i] = malloc(ntowns * sizeof(int));

	read_from_file(ntowns);
	print_distance(ntowns);

	for (i = 0; i < ntowns; i += 1) {
		fire_dept[i] = STATION;
		permute(fire_dept, 0, ntowns, i + 1);
	}

	clean_up(ntowns);
	return 0;
}
示例#3
0
void print_routes(char node, int edges[X]) {
    for (int i = 0; i < X; i++) {
        char neighbor = getNodeName(i);
        int distance = edges[i];
        printf("%c -> %c: ", node, neighbor);
        print_distance(distance);
    }
}
示例#4
0
static void
route_disp_wpt_cb(const waypoint *wpt)
{
    waypoint *prev = cur_info->prev_wpt;

    gbfprintf(fout, "Route Waypoint\t");
    gbfprintf(fout, "%s\t", wpt->shortname);

    if (prev != NULL)
    {
        double dist = waypt_distance_ex(prev, wpt);
        cur_info->total += dist;
        print_distance(cur_info->total, 0, 1, 0);
        print_distance(dist, 0, 1, 0);
        print_course(prev, wpt);
    }
    else
        print_distance(0, 1, 0, 0);

    gbfprintf(fout, "\r\n");

    cur_info->prev_wpt = (waypoint *)wpt;
}
示例#5
0
static void
track_disp_wpt_cb(const waypoint *wpt)
{
    waypoint *prev = cur_info->prev_wpt;
    time_t delta;
    double dist, depth;

    gbfprintf(fout, "Trackpoint\t");

    print_position(wpt);
    print_date_and_time(wpt->creation_time, 0);
    if IS_VALID_ALT(wpt->altitude)
        print_distance(wpt->altitude, 1, 0, 0);

    gbfprintf(fout, "\t");
    depth = WAYPT_GET(wpt, depth, unknown_alt);
    if (depth != unknown_alt)
        print_distance(depth, 1, 0, 1);

    if (prev != NULL) {
        float temp;
        gbfprintf(fout, "\t");
        delta = wpt->creation_time - prev->creation_time;
        temp = WAYPT_GET(wpt, temperature, -999);
        if (temp != -999)
            print_temperature(temp);
        gbfprintf(fout, "\t");
        dist = waypt_distance_ex(prev, wpt);
        print_distance(dist, 0, 1, 0);
        print_date_and_time(delta, 1);
        print_speed(&dist, &delta);
        print_course(prev, wpt);
    }
    gbfprintf(fout, "\r\n");

    cur_info->prev_wpt = (waypoint *)wpt;
}
void Dijkstra(int start_index){
    bool used[SIZE];
    memset(used, 0, sizeof(bool) * SIZE);

    for(int i = 0;i < SIZE;i++){
        if(graph[start_index][i] != MAX_DIST){
            distance[i] = graph[start_index][i];
        }
    }

    used[start_index] = true;

    while(true){
        // choose min index
        int min_dist = MAX_DIST;
        int min_index = -1;
        for(int i = 0;i < SIZE;i++){
            if(used[i]) continue;
            if(distance[i] < min_dist){
                min_index = i;
                min_dist = distance[min_index];
            }
        }
        if(min_index == -1) break; // all nodes have been used
        used[min_index] = true;
#ifdef VERBOSE
        printf("Closest node from %d is %d, distance %d\n", start_index + 1, min_index + 1, min_dist);
#endif

        // try to loose
        for(int i = 0;i < SIZE;i++){
            if(distance[i] > distance[min_index] + graph[min_index][i]){
#ifdef VERBOSE
                printf("Found a shorter way from %d to %d, whose distance is %d\n", min_index + 1, i + 1, distance[min_index] + graph[min_index][i]);
#endif
                distance[i] = distance[min_index] + graph[min_index][i];
            }
        }
#ifdef VERBOSE
        printf("After trying loosing with node %d:\n", min_index + 1);
        print_distance();
        printf("\n");
#endif
    }
}
示例#7
0
static void
route_disp_hdr_cb(const route_head *rte)
{
    current_trk = (route_head *)rte;
    cur_info = &route_info[route_idx];
    cur_info->prev_wpt = NULL;
    cur_info->total = 0;
    if (rte->rte_waypt_ct <= 0) return;

    if (!gtxt_flags.route_header_written) {
        gtxt_flags.route_header_written = 1;
        gbfprintf(fout, "\r\n\r\nHeader\t%s\r\n", headers[route_header]);
    }

    print_string("\r\nRoute\t%s\t", current_trk->rte_name ? current_trk->rte_name : "");
    print_distance(cur_info->length, 0, 1, 0);
    print_course(cur_info->first_wpt, cur_info->last_wpt);
    gbfprintf(fout, "\t%d waypoints\t", cur_info->count);
    print_string("%s\r\n", rte->rte_url ? rte->rte_url : "");
    gbfprintf(fout, "\r\nHeader\t%s\r\n\r\n", headers[rtept_header]);
}
示例#8
0
static void
track_disp_hdr_cb(const route_head *track)
{
    cur_info = &route_info[route_idx];
    cur_info->prev_wpt = NULL;
    cur_info->total = 0;
    current_trk = (route_head *)track;
    if (track->rte_waypt_ct <= 0) return;

    if (!gtxt_flags.track_header_written) {
        gtxt_flags.track_header_written = 1;
        gbfprintf(fout, "\r\n\r\nHeader\t%s\r\n", headers[track_header]);
    }

    print_string("\r\nTrack\t%s\t", current_trk->rte_name ? current_trk->rte_name : "");
    print_date_and_time(cur_info->start, 0);
    print_date_and_time(cur_info->time, 1);
    print_distance(cur_info->length, 0, 1, 0);
    print_speed(&cur_info->length, &cur_info->time);
    print_string("%s", (track->rte_url != NULL) ? track->rte_url : "");
    gbfprintf(fout, "\r\n\r\nHeader\t%s\r\n\r\n", headers[trkpt_header]);
}
int main(){
    for(int i = 0;i < SIZE;i++){
        for(int j = 0;j < SIZE;j++){
            scanf("%d", &graph[i][j]);
            if(graph[i][j] == -1){
                graph[i][j] = MAX_DIST;
            }
        }
    }

    for(int i = 0;i < SIZE;i++){
        distance[i] = MAX_DIST;
    }

    int start_index;
    scanf("%d", &start_index);

    Dijkstra(start_index - 1);
    print_graph();
    print_distance();
    getchar();

    return 0;
}
void shortest_path(int start, int cost[][NODES],
				   int distance[], int n, int found[]) /* 시작노드 start  */
{  
   int i, u, w;
   for(i=0; i<n; i++) /* 초기화 */
   {
	  distance[i] = cost[start][i];
	  path[i] = start;
	  found[i] = FALSE;
   }
   found[start] = TRUE;    /* 시작노드 방문 표시 */
   distance[start] = 0;
   for(i=0; i<n; i++){
	   print_distance();
	  u = choose(distance, n, found);
	  found[u] = TRUE;
	  for(w=0;w<n; w++) 
		   if(!found[w])
			   if( distance[u]+cost[u][w] < distance[w] ) {
				   distance[w] = distance[u]+cost[u][w];	
				path[w] = u;		/* 경유노드 저장 */
		   }
   }
}
示例#11
0
static void
write_waypt(const waypoint *wpt)
{
    unsigned char wpt_class;
    garmin_fs_p gmsd;
    char *wpt_type;
    char *dspl_mode;
    const char *country;
    double x;
    int i, icon, dynamic;
    char *icon_descr;

    gmsd = GMSD_FIND(wpt);

    i = GMSD_GET(display, 0);
    if (i > GT_DISPLAY_MODE_MAX) i = 0;
    dspl_mode = gt_display_mode_names[i];

    wpt_class = GMSD_GET(wpt_class, 0);
    if (wpt_class <= gt_waypt_class_map_line)
        wpt_type = gt_waypt_class_names[wpt_class];
    else
        wpt_type = gt_waypt_class_names[0];

    gbfprintf(fout, "Waypoint\t%s\t", (wpt->shortname) ? wpt->shortname : "");
    if (wpt_class <= gt_waypt_class_airport_ndb) {
        char *temp = wpt->notes;
        if (temp == NULL) {
            if (wpt->description && (strcmp(wpt->description, wpt->shortname) != 0))
                temp = wpt->description;
            else
                temp = "";
        }
        print_string("%s\t", temp);
    }
    else
        gbfprintf(fout, "\t");
    gbfprintf(fout, "%s\t", wpt_type);

    print_position(wpt);

    if IS_VALID_ALT(wpt->altitude)
        print_distance(wpt->altitude, 1, 0, 0);
    gbfprintf(fout, "\t");

    x = WAYPT_GET(wpt, depth, unknown_alt);
    if (x != unknown_alt)
        print_distance(x, 1, 0, 1);
    gbfprintf(fout, "\t");

    x = WAYPT_GET(wpt, proximity, unknown_alt);
    if (x != unknown_alt)
        print_distance(x, 0, 0, 0);
    gbfprintf(fout, "\t");

    x = WAYPT_GET(wpt, temperature, -999);
    if (x != -999)
        print_temperature(x);
    gbfprintf(fout, "\t%s\t", dspl_mode);

    gbfprintf(fout, "Unknown\t"); 				/* Color is fixed: Unknown */

    icon = GMSD_GET(icon, -1);
    if (icon == -1) {
        icon = gt_find_icon_number_from_desc(wpt->icon_descr, GDB);
    }
    icon_descr = gt_find_desc_from_icon_number(icon, GDB, &dynamic);
    print_string("%s\t", icon_descr);
    if (dynamic) xfree(icon_descr);

    print_string("%s\t", GMSD_GET(facility, ""));
    print_string("%s\t", GMSD_GET(city, ""));
    print_string("%s\t", GMSD_GET(state, ""));
    country = gt_get_icao_country(GMSD_GET(cc, ""));
    print_string("%s\t", (country != NULL) ? country : "");
    print_date_and_time(wpt->creation_time, 0);
    print_string("%s\t", wpt->url ? wpt->url : "");
    print_categories(GMSD_GET(category, 0));

    gbfprintf(fout, "\r\n");
}
void main()
{
	shortest_path(0, cost, distance, NODES, found);
	print_path(0,3);
	print_distance();
}