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; }
static int check_connect(cha_lat_t *lat, int m_num) { path_cost_t pcost[PATH1_NUM]; int pcost_num, pcostno; int mrph_cost; mrph_t *new_mrph; new_mrph = nth_mrph(m_num); pcost_num = classify_path(pcost, lat->path_idx, new_mrph->con_tbl); if (pcost_num == 0) return TRUE; /* * 形態素コスト */ if (new_mrph->is_undef) { mrph_cost = Cha_undef_info[new_mrph->is_undef - 1].cost + Cha_undef_info[new_mrph->is_undef - 1].cost_step * new_mrph->headword_len / 2; } else { mrph_cost = Cha_hinsi[new_mrph->posid].cost; } mrph_cost *= new_mrph->weight * Cha_mrph_cost_weight; for (pcostno = 0; pcostno < pcost_num; pcostno++) { if (Cha_cost_width < 0) { Cha_path[Cha_path_num].best_path = pcost[pcostno].pno[0]; } else { /* コスト幅におさまっているパスを抜き出す */ int i; int npath = 0; int path[PATH1_NUM]; int cost_ceil = pcost[pcostno].min_cost + Cha_cost_width; Cha_path[Cha_path_num].best_path = pcost[pcostno].pno[pcost[pcostno].min_cost_no]; for (i = 0; i < pcost[pcostno].num; i++) if (pcost[pcostno].cost[i] <= cost_ceil) path[npath++] = pcost[pcostno].pno[i]; path[npath++] = -1; memcpy(Cha_path[Cha_path_num].path = malloc_int(npath), path, sizeof(int) * npath); } Cha_path[Cha_path_num].cost = pcost[pcostno].min_cost + mrph_cost; Cha_path[Cha_path_num].mrph_p = m_num; Cha_path[Cha_path_num].state = pcost[pcostno].state; Cha_path[Cha_path_num].start = lat->offset; Cha_path[Cha_path_num].end = lat->offset + new_mrph->headword_len; if (++Cha_path_num % CHA_PATH_NUM == 0 && malloc_path()) return FALSE; } return TRUE; }
int main(int argc, const char *argv[]) { const char *socket = NULL; mem_init(); atexit(mem_exit); terminal_init(); // -------------------------------------------- // parse the parameters // Check -v (verbose) first to enable log_debug() // when processing other options for (int i=1; i < argc; i++) if (!strcmp("-v", argv[i])) set_verbose(1); int p = 1; while (p < argc && argv[p][0]=='-') { switch(argv[p][1]) { case 0: // single '-' option ends parameter processing p++; goto endpars; case 'v': assert_single_char(argv[p]); // verbose is already checked above set_verbose(1); break; case '?': assert_single_char(argv[p]); usage(EXIT_SUCCESS); /* usage() exits already */ break; case 'T': assert_single_char(argv[p]); if (p < argc-2) { p++; socket = argv[p]; log_info("main: tools socket = %s\n", socket); } else { log_error("-T requires <socket name> parameter\n"); exit(EXIT_RESPAWN_NEVER); } break; default: log_error("Unknown command line option %s\n", argv[p]); usage(EXIT_RESPAWN_NEVER); break; } p++; } endpars: // -------------------------------------------- // open the socket if (socket == NULL) { const char *home = os_get_home_dir(); socket = malloc_path(home, ".xdtools"); } int sockfd = socket_open(socket, 0); if (sockfd < 0) { log_errno("Could not open socket %s\n", socket); mem_free(socket); exit(1); } mem_free(socket); // -------------------------------------------- // find our command either as ending part of the name of the binary ... const cmdtab_t *cmd = NULL; int l = strlen(argv[0]); for (int i = 0; i < numcmds; i++) { int cl = strlen(cmdtab[i].name); if ((cl <= l) && !strcmp(cmdtab[i].name, &argv[0][l-cl])) { cmd = &cmdtab[i]; break; } } // ... or as command line parameter if (p < argc) { l = strlen(argv[p]); if (cmd == NULL) { for (int i = 0; i < numcmds; i++) { int cl = strlen(cmdtab[i].name); if ((cl <= l) && !strcmp(cmdtab[i].name, argv[p])) { cmd = &cmdtab[i]; p++; break; } } } } if (cmd == NULL) { log_error("Could not identify any of the commands!\n"); usage(1); } int rv = cmd->func(sockfd, argc-p, argv+p); close(sockfd); return rv; }