BZOJ3393:[USACO LPHONE] 激光通讯
分层图+堆优化的dijkstra
将原图分为4层,分别是只向上,向下,向左,向右建立边,然后层与层之间的转移很好处理。稠密图,应该用堆优化的dijkstra。
//OJ 1845 //by Cydiater //2016.10.8 #include <iostream> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <map> #include <ctime> #include <cmath> #include <cstdlib> #include <cstdio> #include <iomanip> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) #define pii pair<int,int> #define mp make_pair const int MAXN=1e6+5; const int oo=0x3f3f3f3f; const int dx[4]={-1,0,1,0}; const int dy[4]={0,1,0,-1}; inline int read(){ char ch=getchar();int x=0,f=1; while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int N,M,node[105][105][4],cnt=0,LINK[MAXN],len=0,dis[MAXN],ans=oo; /* 0 3 1 2 */ pii S,T; bool a[1005][1005],vis[MAXN]; struct edge{ int y,next,v; }e[MAXN<<1]; priority_queue<pii,vector<pii>,greater<pii> >q; namespace solution{ inline void insert(int x,int y,int v){e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;e[len].v=v;} void init(){ M=read();N=read(); up(i,1,N){ scanf("\n"); up(j,1,M){ char ch;scanf("%c",&ch); a[i][j]=ch=='*'?0:1; if(ch=='C'){ if(S.first==0)S=mp(i,j); else T=mp(i,j); } } } up(i,1,N)up(j,1,M)up(k,0,3)node[i][j][k]=++cnt; up(i,1,N)up(j,1,M)if(a[i][j])up(k,0,3){ int aim=(k+1)%4,tx=i+dx[k],ty=j+dy[k]; if(a[tx][ty]){ insert(node[i][j][k],node[tx][ty][k],0); //cout<<i<<' '<<j<<' '<<k<<endl; } if(mp(i,j)!=S&&mp(i,j)!=T){ insert(node[i][j][k],node[i][j][aim],1);aim=(k+3)%4; insert(node[i][j][k],node[i][j][aim],1); } } } void Dijkstra(int st){ memset(vis,0,sizeof(vis)); memset(dis,10,sizeof(dis)); dis[st]=0;q.push(mp(dis[st],st)); while(!q.empty()){ pii tmp=q.top();q.pop(); int node=tmp.second; if(vis[node])continue; vis[node]=1; for(int i=LINK[node];i;i=e[i].next) if(dis[e[i].y]>dis[node]+e[i].v){ dis[e[i].y]=dis[node]+e[i].v; q.push(mp(dis[e[i].y],e[i].y)); } } } void slove(){ up(i,0,3){ Dijkstra(node[S.first][S.second][i]); up(j,0,3)ans=min(ans,dis[node[T.first][T.second][j]]); } cout<<ans<<endl; } } int main(){ //freopen("input.in","r",stdin); //freopen("out.out","w",stdout); using namespace solution; init(); slove(); return 0; }
BZOJ3393:[USACO LPHONE] 激光通讯的更多相关文章
- BZOJ3393 [Usaco2009 Jan]Laserphones 激光通讯 BFS
原文链接http://www.cnblogs.com/zhouzhendong/p/8371735.html 题目传送门 - BZOJ3393 题意概括 直接看原题的翻译吧,很容易懂的. 题解 我不知 ...
- bzoj3393 [Usaco2009 Jan]Laserphones 激光通讯
Description Input 第1行输入w和H,之后W行H列输入地图,图上符号意义如题目描述. Output 最少的对角镜数量. Sample Input 7 8 ....... ...... ...
- BZOJ-USACO被虐记
bzoj上的usaco题目还是很好的(我被虐的很惨. 有必要总结整理一下. 1592: [Usaco2008 Feb]Making the Grade 路面修整 一开始没有想到离散化.然后离散化之后就 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 奶牛通讯 usaco 网络流
这道题很有意思,原题是只需输出最小割集大小,现在oj上改成了输出字典序最小的割集: 题解:可以考虑从小到大删边,若删掉这条边后,最小割变小,保持不变,记录此时的最小割大小: 若最小割不变,恢复这条边: ...
- USACO比赛题泛刷
随时可能弃坑. 因为不知道最近要刷啥所以就决定刷下usaco. 优先级排在学习新算法和打比赛之后. 仅有一句话题解.难一点的可能有代码. 优先级是Gold>Silver.Platinum刷不动. ...
- HTML5笔记:跨域通讯、多线程、本地存储和多图片上传技术
最近做项目在前端我使用了很多新技术,这些技术有bootstrap.angularjs,不过最让我兴奋的还是使用了HTML5的技术,今天我想总结一些HTML5的技术,好记性不如烂笔头,写写文章可以很好的 ...
- (转)利用libcurl和国内著名的两个物联网云端通讯的例程, ubuntu和openwrt下调试成功(四)
1. libcurl 的参考文档如下 CURLOPT_HEADERFUNCTION Pass a pointer to a function that matches the following pr ...
- (转)linux下和云端通讯的例程, ubuntu和openwrt下实验成功(二)
前言: 上节用纯linux的函数实现了和云端通讯, 本节开始利用传说中的神器libcurl 话说一个网络程序员对书法十分感兴趣,退休后决定在这方面有所建树. 于是花重金购买了上等的文房四宝. 一 ...
随机推荐
- xml序列化及反序列化.net对象
序列化一个类通常添加[XmlRoot("根节点名字")] 找到要序列化的内容 对要序列化的类添加 [Serializable]属性用于序列化 对于要序列化的字段添加 [XmlEl ...
- android部分开发摘要
Async 异步 不会阻塞当前线程sync 同步 数据库是应用软件|结构化数据存储 JDBC SQL ellipsis 省略 content provider URI thread--lo ...
- easyui-datagrid 的loader属性用法
API介绍比较简略: 定义如何从远程服务器加载数据.返回false可以放弃本次请求动作.该函数接受以下参数:param:参数对象传递给远程服务器.success(data):当检索数据成功的时候会调用 ...
- tomcat报错
错误日志如下: 十月 10, 2016 10:44:57 上午 org.apache.catalina.core.StandardWrapperValve invoke严重: Servlet.serv ...
- 【HDU 2089】不要62
http://acm.hdu.edu.cn/showproblem.php?pid=2089 数位dp,参照了打野的博客 预处理出f数组,f[i][j]表示第i位为数字j时的可行的数字总数. 对于区间 ...
- 【BZOJ 3529】【SDOI 2014】数表
看Yveh的题解,这道题卡了好长时间,一直不明白为什么要······算了当时太naive我现在都不好意思说了 #include<cstdio> #include<cstring> ...
- bzoj1503
treap改了好长时间,erase写错了... #include<iostream> #include<cstdio> #include<cstdlib> usin ...
- Jquery-input获取单选框选择的按钮
$('input[name="radio"]:checked').val();
- Yii2事务
今天写到发券,发现没加事务,于是学习了下 事务: 是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面 ...
- Python中remove,del和pop的区别
以a=[1,2,3] 为例,似乎使用del, remove, pop一个元素2 之后 a都是为 [1,3], 如下:http://Novell.Me >>> a=[1,2,3] &g ...