Problem UVA12569-Planning mobile robot on Tree (EASY Version)

Accept:138  Submit:686

Time Limit: 3000 mSec

 Problem Description

 Input

The first line contains the number of test cases T (T ≤ 340). Each test case begins with four integers n, m, s, t (4 ≤ n ≤ 15, 0 ≤ m ≤ n−2, 1 ≤ s,t ≤ n, s ̸= t), the number of vertices, the number of obstacles and the label of the source and target. Vertices are numbered 1 to n. The next line contains m different integers not equal to s, the vertices containing obstacles. Each of the next n − 1 lines contains two integers u and v (1 ≤ u < v ≤ n), that means there is an edge u−v in the tree.

 Output

For each test case, print the minimum number of moves k in the first line. Each of the next k lines containstwointegers a and b,thatmeanstomovetherobot/obstaclefrom a to b. Ifthereisnosolution, print ‘-1’. If there are multiple solutions, any will do. Print a blank line after each test case.

 Sample Input

3
4 1 1 3
2
1 2
2 3
2 4
6 2 1 4
2 3
1 2
2 3
3 4
2 5
2 6
8 3 1 5
2 3 4
1 2
2 3
3 4
4 5
1 6
1 7
2 8
 

 Sample Ouput

Case 1: 3
2 4
1 2
2 3
Case 2: 6
2 6
3 2
2 5
1 2
2 3
3 4
Case 3: 16
1 7
2 1
1 6
7 1
1 2
2 8
3 2
2 1
1 7
4 3
3 2
2 1
8 2
2 3
3 4
4 5
 
题解:看到n的范围状压是比较正的思路,二进制储存,BFS搜索,vis数组稍微有一点改动,其中一维记录石头,再有一维记录机器人。水题。
 
 #include <bits/stdc++.h>

 using namespace std;

 const int maxn = ;
int n, m, s, t;
int ori; struct Edge {
int to, next;
}edge[maxn << ]; struct Node {
int sit, robot;
int time;
Node(int sit = , int robot = , int time = ) :
sit(sit), robot(robot), time(time) {}
}; int tot, head[maxn];
pair<int,int> pre[][maxn];
bool vis[][maxn]; void init() {
tot = ;
memset(head, -, sizeof(head));
memset(pre, -, sizeof(pre));
memset(vis, false, sizeof(vis));
} void AddEdge(int u, int v) {
edge[tot].to = v;
edge[tot].next = head[u];
head[u] = tot++;
} inline int get_pos(int x) {
return << x;
} int bfs(pair<int,int> &res) {
queue<Node> que;
que.push(Node(ori, s, ));
vis[ori][s] = true; while (!que.empty()) {
Node first = que.front();
que.pop();
if (first.robot == t) {
res.first = first.sit, res.second = first.robot;
return first.time;
}
int ssit = first.sit, rrob = first.robot;
//printf("%d %d\n", ssit, rrob); for (int i = head[rrob]; i != -; i = edge[i].next) {
int v = edge[i].to;
if (ssit&get_pos(v) || vis[ssit][v]) continue;
vis[ssit][v] = true;
que.push(Node(ssit, v, first.time + ));
pre[ssit][v] = make_pair(ssit, rrob);
} for (int i = ; i < n; i++) {
if (ssit&(get_pos(i))) {
for (int j = head[i]; j != -; j = edge[j].next) {
int v = edge[j].to;
if (v == rrob || (ssit & get_pos(v))) continue;
int tmp = ssit ^ get_pos(v);
tmp ^= get_pos(i);
if (vis[tmp][rrob]) continue;
vis[tmp][rrob] = true;
que.push(Node(tmp, rrob, first.time + ));
pre[tmp][rrob] = make_pair(ssit, rrob);
}
}
}
}
return -;
} void output(pair<int,int> a) {
if (a.first == ori && a.second == s) return;
output(pre[a.first][a.second]);
int ppre = pre[a.first][a.second].first, now = a.first; if (ppre^now) {
int b = -, c = -;
for (int i = ; i < n; i++) {
if (((ppre & ( << i)) == ( << i)) && ((now & ( << i)) == )) {
b = i;
}
else if (((ppre & ( << i)) == ) && ((now & ( << i)) == ( << i))) {
c = i;
}
}
printf("%d %d\n", b + , c + );
}
else {
printf("%d %d\n", pre[a.first][a.second].second + , a.second + );
}
} int con = ; int main()
{
int iCase;
scanf("%d", &iCase);
while (iCase--) {
init();
scanf("%d%d%d%d", &n, &m, &s, &t);
s--, t--;
ori = ;
int x;
for (int i = ; i <= m; i++) {
scanf("%d", &x);
x--;
ori ^= get_pos(x);
} int u, v;
for (int i = ; i <= n - ; i++) {
scanf("%d%d", &u, &v);
u--, v--;
AddEdge(u, v);
AddEdge(v, u);
} pair<int, int> res;
int ans = bfs(res);
printf("Case %d: %d\n", con++, ans);
if (ans != -) output(res);
printf("\n");
}
return ;
}

UVA12569-Planning mobile robot on Tree (EASY Version)(BFS+状态压缩)的更多相关文章

  1. UVA-12569 Planning mobile robot on Tree (EASY Version) (BFS+状态压缩)

    题目大意:一张无向连通图,有一个机器人,若干个石头,每次移动只能移向相连的节点,并且一个节点上只能有一样且一个东西(机器人或石头),找出一种使机器人从指定位置到另一个指定位置的最小步数方案,输出移动步 ...

  2. Uva 12569 Planning mobile robot on Tree (EASY Version)

    基本思路就是Bfs: 本题的一个关键就是如何判段状态重复. 1.如果将状态用一个int型数组表示,即假设为int state[17],state[0]代表机器人的位置,从1到M从小到大表示障碍物的位置 ...

  3. UVA Planning mobile robot on Tree树上的机器人(状态压缩+bfs)

    用(x,s)表示一个状态,x表示机器人的位置,s表示其他位置有没有物体.用个fa数组和act数组记录和打印路径,转移的时候判断一下是不是机器人在动. #include<bits/stdc++.h ...

  4. 2019.03.09 codeforces620E. New Year Tree(线段树+状态压缩)

    传送门 题意:给一棵带颜色的树,可以给子树染色或者问子树里有几种不同的颜色,颜色值不超过606060. 思路:颜色值很小,因此状压一个区间里的颜色用线段树取并集即可. 代码: #include< ...

  5. Codeforces Round #540 (Div. 3) F1. Tree Cutting (Easy Version) 【DFS】

    任意门:http://codeforces.com/contest/1118/problem/F1 F1. Tree Cutting (Easy Version) time limit per tes ...

  6. Ping-Pong (Easy Version)(DFS)

    B. Ping-Pong (Easy Version) time limit per test 2 seconds memory limit per test 256 megabytes input ...

  7. ZOJ 3868 - Earthstone: Easy Version

    3868 - Earthstone: Easy Version Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld ...

  8. Codeforces 1077F1 Pictures with Kittens (easy version)(DP)

    题目链接:Pictures with Kittens (easy version) 题意:给定n长度的数字序列ai,求从中选出x个满足任意k长度区间都至少有一个被选到的最大和. 题解:$dp[i][j ...

  9. Coffee and Coursework (Easy version)

    Coffee and Coursework (Easy version) time limit per test 1 second memory limit per test 256 megabyte ...

随机推荐

  1. JavaWeb学习日记----XML基础

    1.XML基础: XML全称为eXtensible Markup Language;即可扩展标记型语言,同HTML一样使用标签来操作.它的可扩展性体现在标签可以由自己定义,可以是中文标签. XML用途 ...

  2. mysql zip安装

    管理员运行cmd,进入bin目录1.在my.ini(mysql解压目录下)文件中复制下面内容 [client] port = 3306 [mysql] default-character-set=ut ...

  3. K8S helm

    Helm 致力于成为 Kubernetes 的包管理工具,可以方便地发现.共享和构建 Kubernetes 应用,它包含几个基本概念: Chart:一个 Helm 包,其中包含了运行一个应用所需要的镜 ...

  4. ITEXT5.5.8转html为pdf文档解决linux不显示中文问题

    在windows中支持中文,在linux中不显示中文. 解决方法:添加字体库 下载simsun.ttc字体文件,把这文件拷贝到Linux系统的 /usr/share/fonts/ 下就可以了.

  5. 小tips:JS语法之标签(label)

    JavaScript语言允许,语句的前面有标签(label),相当于定位符,用于跳转到程序的任意位置,标签的格式如下. label: statement 标签可以是任意的标识符,但是不能是保留字,语句 ...

  6. Android为TV端助力 不需要Socket的跨进程推送消息AIDL!

    上篇介绍了跨进程实时通讯http://www.cnblogs.com/xiaoxiaing/p/5818161.html 但是他有个缺点就是服务端无法推送消息给客户端,今天这篇文章主要说的就是服务器推 ...

  7. Daydream Controller手柄数据的解析

    参考: How I hacked Google Daydream controller How I hacked Google Daydream controller (Part IV) 反编译代码: ...

  8. ajax post 提交数据和文件

    方式一:常用的方式是通过form.serialize()获取表单数据,但是,这样有个弊端,文件不能上传 $.ajax({ url:'/communication/u/', type:'POST', d ...

  9. React router动态加载组件-适配器模式的应用

    前言 本文讲述怎么实现动态加载组件,并借此阐述适配器模式. 一.普通路由例子 import Center from 'page/center'; import Data from 'page/data ...

  10. C#面向对象 类的继承

    1.类的访问权限: public:跨程序集,命名空间,必须被using引用: internal:默认当前命名空间: 2.类成员的访问权限: private:私有的,只能当前类: protecte:受保 ...