int prim_mst(int src) { IIS q; IV dis(n, INF); BV flg(n); dis[src] = 0; q.insert(II(0, src)); int mst = 0; while (! q.empty()) { int d = q.begin()->first; int v = q.begin()->second; q.erase(q.begin()); if (flg[v]) continue; flg[v] = true; mst += d; For (EL, e, adj[v]) if (!flg[e->v] && e->w < dis[e->v]) { dis[e->v] = e->w; q.insert(II(dis[e->v], e->v)); } } return mst; }
void CMultipleParticleFilter::update(CLaser *Laser) { m_pLaser = Laser; double obs[2], p[2]; for (int n = 0; n < 1; n++){ if (m_pLaser->m_bNodeActive[n]){ std::vector<int> label(m_pLaser->m_LRFClsPoints[n].size(), -1); // クラスタに対応するパーティクルフィルタの番号 int pn = m_ParticleFilter.size(); // 現在のパーティクルフィルタの個数 for (int j = 0; j < m_pLaser->m_LRFClsPoints[n].size(); j++){ // クラスタ代表点 obs[0] = m_pLaser->m_LRFClsPoints[n][j].x; obs[1] = m_pLaser->m_LRFClsPoints[n][j].y; // クラスタ毎に,一番近いパーティクルフィルタを探す double min_r = 1e10; int np = 0; for (vector<CPF>::iterator it = m_ParticleFilter.begin(); it != m_ParticleFilter.end(); ++it, ++np) { p[0] = it->state[0]; p[1] = it->state[1]; double r = sqrt(pow(p[0] - obs[0], 2) + pow(p[1] - obs[1], 2)); if (min_r > r && r < m_min_distance){ min_r = r; label[j] = np; } } // もし,クラスタに対応するパーティクルフィルタがなかったとき if (min_r >= m_min_distance){ label[j] = pn++; } } std::vector<int> flg(pn, -1); // クラスタに対応するパーティクルフィルタの番号 for (int j = 0; j < m_pLaser->m_LRFClsPoints[n].size(); j++){ if (label[j] < 0){ std::cout << "Error" << std::endl; } else if (label[j] < m_ParticleFilter.size()){ obs[0] = m_pLaser->m_LRFClsPoints[n][j].x; obs[1] = m_pLaser->m_LRFClsPoints[n][j].y; m_ParticleFilter[label[j]].SetTarget(obs); m_ParticleFilter[label[j]].update(); } else{ CPF pf; int d = Config::is()->particle_area * 1000; obs[0] = m_pLaser->m_LRFClsPoints[n][j].x; obs[1] = m_pLaser->m_LRFClsPoints[n][j].y; int area[4] = {obs[0]-m_initial_dist/2, obs[1]-m_initial_dist/2, obs[0]+m_initial_dist/2, obs[1]+m_initial_dist/2}; pf.initialize(area); pf.SetTarget(obs); pf.SetID(m_ID++); pf.update(); m_ParticleFilter.push_back(pf); } flg[label[j]] = 1; } int np = 0; for (vector<CPF>::iterator it = m_ParticleFilter.begin(); it != m_ParticleFilter.end(); ++it, ++np) { if (flg[np] < 0) { it->clear(); it = m_ParticleFilter.erase(it); if (it == m_ParticleFilter.end()) break; } } for (int i = 0; i < MAX_TRACKING_OBJECT; i++){ delete m_pLaser->m_pTarget[i]; m_pLaser->m_pTarget[i] = NULL; } np = 0; for (vector<CPF>::iterator it = m_ParticleFilter.begin(); it != m_ParticleFilter.end(); ++it, ++np) { m_pLaser->m_pTarget[np] = new CTarget(); m_pLaser->m_pTarget[np]->id = it->GetID(); m_pLaser->m_pTarget[np]->cnt = it->GetCnt(); m_pLaser->m_pTarget[np]->SetPosi(it->state[0], it->state[1]); } } } }
void SessionServer::addUsr() { class EmptyAuth { public: int operator () (SafeInfo* info, fdtype_t type) { return 0; } }; char username[_MAXUNAMESIZE]; char password[_MAXPSDSIZE]; if(!readSBuf(username, _MAXUNAMESIZE)) return; if(!readSBuf(password, _MAXPSDSIZE)) return; if(userId != 1) { int rs = ERR_OPERATOR_DENY; writeSBuf((char*) &rs, sizeof(rs)); return; } std::lock_guard<XHYFileManager> flg(*manager); if(!addableUser(username)) { int merr = err; writeSBuf((char*) &merr, sizeof(merr)); return; } int fd = manager->open("/sys/user.d", OPTYPE_READ | OPTYPE_WRITE, EmptyAuth()); if(fd == 0) { int merr = manager->getErrno(); writeSBuf((char*) &merr, sizeof(merr)); return; } FileGuard<XHYFileManager, int> fgrd(*manager, fd); int tx = manager->seek(fd, 0, XHYFileManager::end); if(tx < 0) { int merr = manager->getErrno(); writeSBuf((char*) &merr, sizeof(merr)); return; } tx = manager->tell(fd); if(tx < 0) { int merr = manager->getErrno(); writeSBuf((char*) &merr, sizeof(merr)); return; } uidsize_t id = tx / (sizeof(uidsize_t) + _MAXUNAMESIZE + _MAXPSDSIZE) + 1; if(!writeFBuf(fd, (char*) &id, sizeof(id))) { int merr = manager->getErrno(); writeSBuf((char*) &merr, sizeof(merr)); return; } if(!writeFBuf(fd, username, _MAXUNAMESIZE)) { int merr = manager->getErrno(); writeSBuf((char*) &merr, sizeof(merr)); return; } if(!writeFBuf(fd, password, _MAXPSDSIZE)) { int merr = manager->getErrno(); writeSBuf((char*) &merr, sizeof(merr)); return; } int rs = 0; writeSBuf((char*) &rs, sizeof(rs)); }
void wait::join_game(bool observe) { const bool download_res = download_level_data(); if (!download_res) { DBG_MP << "mp wait: could not download level data, quitting..."; set_result(QUIT); return; } else if (!get_scenario()["allow_new_game"].to_bool(true) && !level_.child_or_empty("multiplayer")["savegame"].to_bool(false)) { set_result(PLAY); return; } if (first_scenario_) { state_ = saved_game(); state_.classification().campaign_type = game_classification::CAMPAIGN_TYPE::MULTIPLAYER; const config* campaign = &game_config_manager::get()-> game_config().find_child("campaign", "id", level_.child("multiplayer")["mp_campaign"]); const config* scenario = &game_config_manager::get()-> game_config().find_child("multiplayer", "id", level_.child(lexical_cast<std::string>(game_classification::CAMPAIGN_TYPE::MULTIPLAYER))["id"]); const config* era = &game_config_manager::get()-> game_config().find_child("era", "id", level_.child("era")["id"]); if (*campaign) { state_.classification().difficulty = level_.child("multiplayer")["difficulty_define"].str(); state_.classification().campaign_define = (*campaign)["define"].str(); state_.classification().campaign_xtra_defines = utils::split((*campaign)["extra_defines"]); } if (*scenario) state_.classification().scenario_define = (*scenario)["define"].str(); if (*era) state_.classification().era_define = (*era)["define"].str(); BOOST_FOREACH(const config& mod, level_.child_range("modification")) { const config* modification = &game_config_manager::get()-> game_config().find_child("modification", "id", mod["id"]); if (*modification) { state_.classification().mod_defines.push_back( (*modification)["define"].str()); } } // Make sure that we have the same config as host, if possible. game_config_manager::get()-> load_game_config_for_game(state_.classification()); } // Add the map name to the title. append_to_title(": " + get_scenario()["name"].t_str()); if (!observe) { //search for an appropriate vacant slot. If a description is set //(i.e. we're loading from a saved game), then prefer to get the side //with the same description as our login. Otherwise just choose the first //available side. const config *side_choice = NULL; int side_num = -1, nb_sides = 0; BOOST_FOREACH(const config &sd, get_scenario().child_range("side")) { DBG_MP << "*** side " << nb_sides << "***\n" << sd.debug() << "***\n"; if (sd["controller"] == "reserved" && sd["current_player"] == preferences::login()) { side_choice = &sd; side_num = nb_sides; break; } if (sd["controller"] == "network" && sd["player_id"].empty()) { if (!side_choice) { // found the first empty side side_choice = &sd; side_num = nb_sides; } if (sd["current_player"] == preferences::login()) { side_choice = &sd; side_num = nb_sides; break; // found the preferred one } } ++nb_sides; } if (!side_choice) { size_t count = 0; for(config::child_itors its = get_scenario().child_range("side"); its.second != its.first; ++its.first) { ++count; } DBG_MP << "could not find a side, all " << count << " sides were unsuitable\n"; set_result(QUIT); return; } bool allow_changes = (*side_choice)["allow_changes"].to_bool(true); //if the client is allowed to choose their team, instead of having //it set by the server, do that here. if(allow_changes) { events::event_context context; const config &era = level_.child("era"); /** @todo Check whether we have the era. If we don't inform the user. */ if (!era) throw config::error(_("No era information found.")); config::const_child_itors possible_sides = era.child_range("multiplayer_side"); if (possible_sides.first == possible_sides.second) { set_result(QUIT); throw config::error(_("No multiplayer sides found")); } int color = side_num; const std::string color_str = (*side_choice)["color"]; if (!color_str.empty()) color = game_config::color_info(color_str).index() - 1; std::vector<const config*> era_factions; BOOST_FOREACH(const config &side, possible_sides) { era_factions.push_back(&side); } const bool lock_settings = get_scenario()["force_lock_settings"].to_bool(); const bool use_map_settings = level_.child("multiplayer")["mp_use_map_settings"].to_bool(); const bool saved_game = level_.child("multiplayer")["savegame"].to_bool(); ng::flg_manager flg(era_factions, *side_choice, lock_settings, use_map_settings, saved_game, color); std::vector<std::string> choices; BOOST_FOREACH(const config *s, flg.choosable_factions()) { const config &side = *s; const std::string &name = side["name"]; const std::string &icon = side["image"]; if (!icon.empty()) { std::string rgb = side["flag_rgb"]; if (rgb.empty()) rgb = "magenta"; choices.push_back(IMAGE_PREFIX + icon + "~RC(" + rgb + ">" + lexical_cast<std::string>(color+1) + ")" + COLUMN_SEPARATOR + name); } else { choices.push_back(name); } } std::vector<gui::preview_pane* > preview_panes; leader_preview_pane leader_selector(disp(), flg, color); preview_panes.push_back(&leader_selector); const int faction_choice = gui::show_dialog(disp(), NULL, _("Choose your faction:"), _("Starting position: ") + lexical_cast<std::string>(side_num + 1), gui::OK_CANCEL, &choices, &preview_panes); if(faction_choice < 0) { set_result(QUIT); return; } config faction; config& change = faction.add_child("change_faction"); change["change_faction"] = true; change["name"] = preferences::login(); change["faction"] = flg.current_faction()["id"]; change["leader"] = flg.current_leader(); change["gender"] = flg.current_gender(); network::send_data(faction, 0); } }