当前位置: 首页 > news >正文

无忧网站建设服务2021百度热搜年度榜

无忧网站建设服务,2021百度热搜年度榜,yy直播在线观看,福州网站关键词题目链接:Planning mobile robot on Tree (EASY Version) 题目描述: 给定一棵树,树上有一个位置存在一个机器人,其他mmm个位置存在石头,保证初始状态一个结点最多一个物体(一个石头或者一个机器人或者为空…

题目链接:Planning mobile robot on Tree (EASY Version)
题目描述:

给定一棵树,树上有一个位置存在一个机器人,其他mmm个位置存在石头,保证初始状态一个结点最多一个物体(一个石头或者一个机器人或者为空),你的任务是用尽量少的操作将机器人移动到目标结点,如果不能到达输出−1-11,如果可以输出路径,如果存在多条最小路径输出任意一条即可。你可以执行的操作如下:

  • 将一个机器人移动到与其相邻的某个空结点上。
  • 将一个石头移动到与其相邻的某个空结点上。

题解:

本题可以使用BFSBFSBFS来做,由于最多有151515个结点,我们可以用一个151515位的二进制来表示某个结点是否存在石头或者机器人,同时我们可以用一个变量来记录某个状态的机器人的位置。那么我们只需要进行简单的BFSBFSBFS即可找到最短路径:
dis[s][i]dis[s][i]dis[s][i]表示当前状态为sss,机器人的位置在jjj时需要的移动次数。那么移动的操作(u,v)(u,v)(u,v)可行的条件是:

  • sssuuu位置有东西
  • u,vu,vu,v之间存在边
  • sssvvv位置没有东西(一个不能存在两个物体)

如何进行路径点的输出?路径的输出有很多种方法,我采用的是记录每个状态的上一次的状态,然后通过递归来输出状态(这里也可以使用一个栈来输出,只要满足先进后出即可),当前的状态与转移到当前状态的标记不同的结点就是发生了移动操作的结点。

代码:

#include <bits/stdc++.h>const int MAXN = 15;
const int MAXM = MAXN - 2;using namespace std;int dis[1 << 16][MAXN];
int haveStone[MAXN], head[MAXN];
int T, n, m, s, t, stonePos, caseID, ecnt, u, v;typedef pair<int, int> State;State ans;
State pre[1 << 16][MAXN];struct EdgeList
{int to;int nex;
}es[MAXN << 1];void addEdge(int u, int v)
{es[ecnt].to = v;es[ecnt].nex = head[u];head[u] = ecnt++;
}State getInitialState()
{int status = 0;for (int i = 0; i < n; i++) { status |= (int)haveStone[i] << i; }status |= 1 << s;return make_pair(status, s);
}void bfs()
{queue<State> q;State &&initialState = getInitialState();dis[initialState.first][initialState.second] = 0;q.push(initialState);State now, newState;while (!q.empty()) {now = q.front();q.pop();if (now.second == t) {ans = now;return;}for (int u = 0; u < n; u++) {if (((1 << u) & now.first) == 0) { continue; }for (int i = head[u]; i != -1; i = es[i].nex) {int v = es[i].to; // 进行u->v的移动if (((1 << v) & now.first) != 0) { continue; }newState.first = now.first ^ (1 << u) ^ (1 << v);if (u == now.second) { newState.second = v; }else { newState.second = now.second; }if (dis[newState.first][newState.second] != -1) { continue; }dis[newState.first][newState.second] = dis[now.first][now.second] + 1;pre[newState.first][newState.second] = now;q.push(newState);}}}
}void print(State &now)
{if (now.second == -1 || pre[now.first][now.second].second == -1) { return; }print(pre[now.first][now.second]);for (int i = 0; i < n; i++) {if ((now.first & (1 << i)) == 0 && (pre[now.first][now.second].first & (1 << i)) != 0)  {u = i + 1;}if ((now.first & (1 << i)) != 0 && (pre[now.first][now.second].first & (1 << i)) == 0) {v = i + 1;}}cout << u << " " << v << endl;
}void printPath()
{caseID++;cout << "Case " << caseID << ": ";if (ans.second == -1) {cout << "-1" << endl;return;}cout << dis[ans.first][ans.second] << endl;print(ans);cout << endl;
}void init()
{ecnt = 0;ans.second = -1;memset(pre, -1, sizeof(pre));memset(dis, -1, sizeof(dis));memset(head, -1, sizeof(head));memset(haveStone, 0, sizeof(haveStone));
}int main()
{cin >> T;while (T--) {init();cin >> n >> m >> s >> t; s--; t--;for (int i = 0; i < m; i++) {cin >> stonePos; stonePos--;haveStone[stonePos] = true;}for (int i = 0; i < n - 1; i++) {cin >> u >> v; u--; v--;addEdge(u, v); addEdge(v, u);}bfs();printPath();}return 0;
}
http://www.dinnco.com/news/61543.html

相关文章:

  • 日用品企业网站建设关键词排名优化易下拉排名
  • 网站可以做外部链接吗seo什么意思中文意思
  • 利于seo优化的网站深圳seo推广培训
  • 网站建设企业网站制作舆情通
  • 国内网站建设代理百度关键词查询排名
  • 做网站策划师的图片建网站赚钱
  • 网站模板怎么弄婚恋网站排名前三
  • 肃宁县做网站搭建网站流程
  • 邢台疫情解封最新消息湛江百度seo公司
  • 网站 会员系统 织梦百度指数平台官网
  • 环境搭建好了wordpress怎么建设湖南seo排名
  • 免费制作app软件教程网站关键词排名优化推广软件
  • 查询网站死链接搜索引擎关键词排名优化
  • 怎么做能够让网站流量大360网站推广
  • 洪梅网站建设哪里能搜索引擎优化
  • 唐山网站建设最好的怎么制作seo搜索优化
  • 自建服务器做网站合肥seo优化外包公司
  • 丽水专业网站建设哪家好北大青鸟培训机构靠谱吗
  • 沈阳建设网站建站培训机构排名一览表
  • 日本风格网站湖北seo公司
  • 附近寻爱安徽网站建设优化推广
  • 如何用用dw做网站后台百度推广账户登陆
  • 自己随便玩玩的网站怎么建设t和p在一起怎么做网站
  • 杭州网站建设杭州沃迩夫深圳网站seo哪家快
  • 班级网页制作模板seo培训网的优点是
  • 网网站制作深圳网络公司推广
  • 阿里建站系统百度竞价排名魏则西事件分析
  • rtk建站教程刷关键词排名seo软件软件
  • 谷歌做网站推广如何找客户资源
  • 做网站首页可以用传媒公司吗品牌营销策略四种类型