分层图+堆优化的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] 激光通讯的更多相关文章

  1. BZOJ3393 [Usaco2009 Jan]Laserphones 激光通讯 BFS

    原文链接http://www.cnblogs.com/zhouzhendong/p/8371735.html 题目传送门 - BZOJ3393 题意概括 直接看原题的翻译吧,很容易懂的. 题解 我不知 ...

  2. bzoj3393 [Usaco2009 Jan]Laserphones 激光通讯

    Description Input 第1行输入w和H,之后W行H列输入地图,图上符号意义如题目描述. Output 最少的对角镜数量. Sample Input 7 8 ....... ...... ...

  3. BZOJ-USACO被虐记

    bzoj上的usaco题目还是很好的(我被虐的很惨. 有必要总结整理一下. 1592: [Usaco2008 Feb]Making the Grade 路面修整 一开始没有想到离散化.然后离散化之后就 ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. 奶牛通讯 usaco 网络流

    这道题很有意思,原题是只需输出最小割集大小,现在oj上改成了输出字典序最小的割集: 题解:可以考虑从小到大删边,若删掉这条边后,最小割变小,保持不变,记录此时的最小割大小: 若最小割不变,恢复这条边: ...

  6. USACO比赛题泛刷

    随时可能弃坑. 因为不知道最近要刷啥所以就决定刷下usaco. 优先级排在学习新算法和打比赛之后. 仅有一句话题解.难一点的可能有代码. 优先级是Gold>Silver.Platinum刷不动. ...

  7. HTML5笔记:跨域通讯、多线程、本地存储和多图片上传技术

    最近做项目在前端我使用了很多新技术,这些技术有bootstrap.angularjs,不过最让我兴奋的还是使用了HTML5的技术,今天我想总结一些HTML5的技术,好记性不如烂笔头,写写文章可以很好的 ...

  8. (转)利用libcurl和国内著名的两个物联网云端通讯的例程, ubuntu和openwrt下调试成功(四)

    1. libcurl 的参考文档如下 CURLOPT_HEADERFUNCTION Pass a pointer to a function that matches the following pr ...

  9. (转)linux下和云端通讯的例程, ubuntu和openwrt下实验成功(二)

    前言: 上节用纯linux的函数实现了和云端通讯, 本节开始利用传说中的神器libcurl 话说一个网络程序员对书法十分感兴趣,退休后决定在这方面有所建树. 于是花重金购买了上等的文房四宝.    一 ...

随机推荐

  1. 天龙客户端的GameManager

    看天龙的结构,奇怪为什么这么多直接继承了MonoBehaviour,而不是自己实现一套帧频更新呢,两者利弊都在哪? 从顶层来看看GameManager的单件. 管理了当前的载入的场景(ActiveSc ...

  2. Sublime Text 必备插件

    收集网址:http://segmentfault.com/a/1190000002748032

  3. Beta项目冲刺 --第一天

    新的开始.. 队伍:F4 成员:031302301 毕容甲 031302302 蔡逸轩 031302430 肖阳 031302418 黄彦宁 会议内容: 1.站立式会议照片: 2.项目燃尽图 3.冲刺 ...

  4. (02)javascript属性

    私有属性(私有变量和私有方法) 实例属性(实例变量和实例方法) 静态属性(静态变量和静态方法) <!DOCTYPE html> <html lang="en"&g ...

  5. Andriod ADB开启Activity、Service以及BroadCast(包括参数的传递)

    /*****************开启Activity  并传递参数*******************/ 使用am命令启动Activity并传递参数的方法,也能用作C层与Java进行数据传递的一 ...

  6. 数组的方法 Array.map();Array.every()和Array.some();数组的indexof();检测是否是数组isArray(obj);

    数组的方法 Array.map(); 栗子: var a=[1,2,,3]; var b=a.map( function(value){return value*value} ); alert(b); ...

  7. Dubbo_创建Dubbo服务并在ZooKeeper注册,然后通过Jar包执行

    一.安装ZooKeeper(略) 二.创建Dubbo服务  1.DemoService 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  8. 状态压缩 HDU 3182

    t组数据 n个汉堡 e的能量 接下来的2行 val    n个 得到的权 cost  n个 花去的能量 接下来n行 每行一个q  q个数字 代表这类汉堡做好要的前提  每个汉堡只能用一次 #inclu ...

  9. python中的函数以及递归

    一  函数 函数的组成: def funname(parameters): instructions.... 在探讨函数的定义之前,让我们想想,如果我们写了上千行代码,其实各种变量定义,循环..... ...

  10. 100803C

    画个图,很容易发现少兜圈子,就是说这些限制c[i],d[i]可以看做[c[i],d[i]],不让那些区间相交,然后就可以了 #include<iostream> #include<c ...