BZOJ1687: [Usaco2005 Open]Navigating the City 城市交通 Spfa
来源:互联网 发布:数控车床电脑编程软件 编辑:程序博客网 时间:2024/06/08 07:57
1687: [Usaco2005 Open]Navigating the City 城市交通
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 130 Solved: 93
[Submit][Status][Discuss]
Description
由于牛奶市场的需求,奶牛必须前往城市,但是唯一可用的交通工具是出租车.教会奶牛如何在城市里打的.
给出一个城市地图,东西街区E(1≤E≤40),南北街区N(1≤N≤30).制作一个开车指南给出租车司机,告诉他如何从起点(用S表示)到终点(用E表示).每一个条目用空格分成两部分,第一个部分是方向(N,E,S,W之一),第二个是一个整数,表示要沿着这个方向开几个十字路口.如果存在多条路线,你应该给出最短的.数据保证,最短的路径存在且唯一. 地图中“+”表示十字路口,道路用“I”和“一”表示.建筑和其他设施用“.”表示.下面是一张地图:
出租车可以沿着东,北,西,北,东开两个十字路口,以此类推.具体将由样例给出
Input
第1行:两个用空格隔开的整数N和E.
第2到2N行:每行有2E-I个字符,表示地图.
Output
每行有一个表示方向的字母和一个表示要开几个十字路口的数字表示.
Sample Input
Sample Input
Sample Output
E 1
N 1
W 1
N 1
E 2
S 1
E 3
S 1
W 1
N 1
W 1
N 1
E 2
S 1
E 3
S 1
W 1
题解:
把+转化为节点,把"|"或"-"转化成路径,然后跑最短路就可以了。
再记录一下每个点是被哪个点最后更新的,方便找答案、
#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<queue>using namespace std;const int N=105;const int M=100005;const int inf=1707185547;char mp[N][N],ans[M];int n,m,s,t;int to[M],nxt[M],lj[M],from[M],cnt;void add(int f,int t){cnt++;from[cnt]=f; to[cnt]=t;nxt[cnt]=lj[f];lj[f]=cnt;}void insert(int x,int y){add(x,y),add(y,x);}int get(int x,int y){return (x-1)*m+y;}queue<int>Q;int d[M],qj[M];bool inq[M];void Spfa(int s){for(int i=1;i<=n*m;i++) d[i]=inf;d[s]=0;Q.push(s);while(!Q.empty()){int x=Q.front();Q.pop();inq[x]=false;for(int i=lj[x];i;i=nxt[i])if(d[to[i]]>d[x]+1){d[to[i]]=d[x]+1;qj[to[i]]=x;if(!inq[to[i]]){Q.push(to[i]);inq[to[i]]=true; } }}}int tot;void Query(int x){if(!x) return;Query(qj[x]);tot++;if(x==qj[x]+2) ans[tot]='E';if(x==qj[x]-2) ans[tot]='W';if(x==qj[x]+m*2) ans[tot]='S';if(x==qj[x]-m*2) ans[tot]='N';}int main(){scanf("%d%d",&n,&m);n=n*2-1,m=m*2-1;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){ cin>>mp[i][j];if(mp[i][j]=='S'){ s=get(i,j); mp[i][j]='+';} if(mp[i][j]=='E') { t=get(i,j); mp[i][j]='+';}}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(mp[i][j]=='+') {if(i>=3) if(mp[i-2][j]=='+'&&mp[i-1][j]!='.') insert(get(i,j),get(i-2,j)); if(j>=3) if(mp[i][j-2]=='+'&&mp[i][j-1]!='.') insert(get(i,j),get(i,j-2));}Spfa(s);Query(t);for(int i=2;i<=tot;i++){int p=0;while(ans[i]==ans[i+1]) p++,i++;printf("%c %d\n",ans[i],p+1);}}
0 0
- BZOJ1687: [Usaco2005 Open]Navigating the City 城市交通 Spfa
- bzoj1687: [Usaco2005 Open]Navigating the City 城市交通
- BZOJ1687: [Usaco2005 Open]Navigating the City 城市交通
- bzoj 1687: [Usaco2005 Open]Navigating the City 城市交通 bfs
- bzoj 1687: [Usaco2005 Open]Navigating the City 城市交通(BFS)
- Cpp环境【POJ2435】【CQYZOJ3034】【USACO2005 U S Open Silver】Navigating the City城市交通
- poj Navigating the City 水bfs
- 【spfa+拆点】城市交通
- 1752: [Usaco2005 qua]Til the Cows Come Home (SPFA)
- Navigating the Component Buffer
- bzoj1748 [Usaco2005 open]Around the world 环球飞行
- 【bzoj1683】 [Usaco2005 Nov]City skyline 城市地平线
- 城市交通
- 城市交通
- 城市交通
- 城市交通
- 城市交通
- 城市交通
- 关于map reduce的一点思考
- 生鲜o2o配送开源系统,包括Android源码+SSH后台管理系统
- webApp禁止页面整体下拉,不影响页面内部scroll
- Fragment中关于Simpleadapter的 无指针问题 nullpoint 以及runnable问题
- eclipse环境修改包名
- BZOJ1687: [Usaco2005 Open]Navigating the City 城市交通 Spfa
- N卡双显卡笔记本升级或安装win10开机后登陆界面黑屏
- Linux进阶命令
- React Native 中组件的生命周期
- 使用git(一)git简介及基本工作流程
- leetcode之位运算取得数组中只出现一次的一个数
- Linux中强大且常用命令:find、grep
- iostream迭代器操作"txt文本文件"无法写入的思考
- poj 2096