UVA Planning mobile robot on Tree树上的机器人(状态压缩+bfs)
2015-07-31 11:51
429 查看
用(x,s)表示一个状态,x表示机器人的位置,s表示其他位置有没有物体。用个fa数组和act数组记录和打印路径,转移的时候判断一下是不是机器人在动。
#include<bits/stdc++.h> using namespace std; const int maxn = 16; const int maxe = 32; const int MAXSTA = 491520+10; // 2^15*15 int head[maxn],to[maxe],nxt[maxe]; int ecnt; void addEdge(int u,int v) { to[ecnt] = v; nxt[ecnt] = head[u]; head[u] = ecnt++; } struct Node { int x,s; Node(){} Node(int X ,int S ){ x = X; s = S; } }q[MAXSTA]; int fa[MAXSTA],dist[MAXSTA]; struct Act { int u,v; Act(int U = 0,int V = 0):u(U),v(V){} }act[MAXSTA]; bool vis[32768][15]; int n,m,s,t,sta; void print_ans(int u) { if(~fa[u])print_ans(fa[u]); else return; printf("%d %d\n",act[u].u+1,act[u].v+1); } void bfs() { int _front = 0,rear = 0; q[rear].x = s; q[rear].s = sta; fa[rear] = -1; dist[rear++] = 0; memset(vis,0,sizeof(vis)); vis[sta][s] = true; while(_front<rear){ Node &u = q[_front]; if(u.x == t) { printf("%d\n",dist[_front]); print_ans(_front); return ; } for(int who = 0; who < n; who++) if(u.s>>who&1){ int newSta = u.s^(1<<who); for(int i = head[who]; ~i; i = nxt[i]) if((u.s>>to[i]&1)^1) { Node &v = q[rear]; v.s = newSta|1<<to[i]; v.x = who != u.x ? u.x : to[i]; if(!vis[v.s][v.x]){ vis[v.s][v.x] = true; fa[rear] = _front; act[rear].u = who;act[rear].v = to[i]; dist[rear++] = dist[_front] + 1; } } } _front++; } printf("-1\n"); } int main() { //freopen("in.txt","r",stdin); int T; scanf("%d",&T); for(int cas = 1; cas <= T; cas++){ scanf("%d%d%d%d",&n,&m,&s,&t); s--; t--; sta = 1<<s; for(int i = 0; i < m; i++) { int t; scanf("%d",&t); sta |= 1<<(t-1); } ecnt = 0; memset(head,-1,sizeof(head)); for(int i = 1; i < n; i++){ int u,v; scanf("%d%d",&u,&v); u--;v--; addEdge(u,v); addEdge(v,u); } printf("Case %d: ",cas); bfs(); } return 0; }
相关文章推荐
- 【原】隐藏ultraGrid1指定列
- javascript文本模板用法实例
- 指针的几个重要概念
- Java多线程技术
- Django响应大文件下载请求
- 个人多年经典收藏集合(SQL) 推荐大家收藏
- 使用 Visual Studio 开发并调试 Mail Add-in (mail app for Outlook)
- fsck系统修复
- Entity Framework 学习总结之一:ADO.NET 实体框架概述
- 第二十六篇:两个SOUI新控件 ---- SListView和SComboView(借用Andorid的设计)
- ubuntu MySQL 5.5 deb 安装
- 微软官方博客正式公布24小时Win10安装量:已超1400万台
- poj解题报告——1730
- oracle insert into select模板
- leetcode Ch7-Graph Search
- web第三方登录接入
- django结合apache部署
- web第三方登录接入
- Megacli中建立虚拟盘参数的含义
- 使用Python创建简单的HTTP和FTP服务