XDOJ 1202: The Offer - Lunatic

题目链接:http://acm.xidian.edu.cn/problem.php?id=1202

题目大意:给定一个$n \times m$的网格图,每个格子上有值$h[i][j]$。有两种移动方式:1.移动到相邻的格子(代价为原位置和移动后位置上的值之和);2.在给定的$k$个矩形内,若两个格子值相差不超过$p[k]$,则可互相移动(代价为$t[k]$)。现给定起点坐标和终点坐标,问最小代价。

Dijkstra

关键在于建图,建好图后直接跑最短路就好了。

给每个矩形设$3 \times 101$个虚点,将该矩形内$h[i][j]=x$的点分别与三个虚点$d_x^1,d_x^2,d_x^3$相连(其中$d_x^1$指向点$(i,j)$(边长为$0$),点$(i,j)$指向$d_x^2$(边长为$0$),$d_x^3$与点$(i,j)$互相连接(边长为$t[k]$)),最后将符合条件($fabs(a-b)  \leqslant p[k]$)的$d_a^1$点与$d_b^2$点相连接(边长为$2 \times t[k]$)。

(考虑到$t[k]$可能不能被$2$整除,将所有边长乘$2$,再将结果除$2$)。

具体结构如下图所示(请叫我灵魂画师,不接受批评歇歇):

最后将相邻格子互相连边,跑下Dijkstra即可。

建图复杂度为$O(rn^2MAX\{h[i][j]\})$,故总复杂度为$O(rn^2MAX\{h[i][j]\}+n^2logn)$.

代码如下:

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <vector>
  4 #include <queue>
  5 #define N 105
  6 #define R 15
  7 #define X first
  8 #define Y second
  9 using namespace std;
 10 typedef long long ll;
 11 typedef pair<ll,ll> P;
 12 const ll inf=1000000000000000LL;
 13 ll CASE,mp[N][N],n,m,r,t[R],p[R],dis[N*N+3*R*N];
 14 bool vis[N*N+3*R*N];
 15 P a[R],b[R],S,T;
 16 struct edge{
 17     ll to,w;
 18     edge(ll T,ll W){to=T;w=W;}
 19 };
 20 struct node{
 21     ll u,d;
 22     node(ll U,ll D){u=U;d=D;}
 23     bool operator < (const node x)const{return d>x.d;}
 24 };
 25 vector<edge>e[N*N+3*R*N];
 26 priority_queue<node>q;
 27 void init(){
 28     for(ll i=0;i<n*m+3*101*r;++i)e[i].clear();
 29     for(ll k=0;k<r;++k){
 30         ll bs=n*m+k*3*101;
 31         for(ll i=a[k].X;i<=b[k].X;++i){
 32             for(ll j=a[k].Y;j<=b[k].Y;++j){
 33                 ll d1=bs+3*mp[i][j],d2=bs+3*mp[i][j]+1,d3=bs+3*mp[i][j]+2;
 34                 e[d1].push_back(edge(i*m+j,0));
 35                 e[i*m+j].push_back(edge(d2,0));
 36                 e[d3].push_back(edge(i*m+j,t[k]));
 37                 e[i*m+j].push_back(edge(d3,t[k]));
 38             }
 39         }
 40         for(ll i=0;i<=100;i++){
 41             for(ll j=i;j<=i+p[k]&&j<=100;j++){
 42                 e[bs+3*i+1].push_back(edge(bs+3*j,2*t[k]));
 43                 e[bs+3*j+1].push_back(edge(bs+3*i,2*t[k]));
 44             }
 45         }
 46     }
 47     for(ll i=0;i<n;++i){
 48         for(ll j=0;j<m;++j){
 49             int k=i*m+j;
 50             if(i!=0)e[k].push_back(edge((i-1)*m+j,2*(mp[i][j]+mp[i-1][j])));
 51             if(i!=n-1)e[k].push_back(edge((i+1)*m+j,2*(mp[i][j]+mp[i+1][j])));
 52             if(j!=0)e[k].push_back(edge(i*m+j-1,2*(mp[i][j]+mp[i][j-1])));
 53             if(j!=m-1)e[k].push_back(edge(i*m+j+1,2*(mp[i][j]+mp[i][j+1])));
 54         }
 55     }
 56 }
 57 ll dijkstra(ll s,ll d){
 58     ll tot=n*m+3*101*r;
 59     for(ll i=0;i<tot;++i){
 60         dis[i]=inf;
 61         vis[i]=0;
 62     }
 63     dis[s]=0;
 64     while(!q.empty())q.pop();
 65     q.push(node(s,0));
 66     while(!q.empty()){
 67         node t=q.top();q.pop();
 68         ll u=t.u;
 69         if(vis[u])continue;
 70         vis[u]=1;
 71         for(ll i=0;i<(ll)e[u].size();++i){
 72             ll v=e[u][i].to,w=e[u][i].w;
 73             if(dis[u]+w<dis[v]){
 74                 dis[v]=dis[u]+w;
 75                 q.push(node(v,dis[v]));
 76             }
 77         }
 78     }
 79     return dis[d];
 80 }
 81 int main(void){
 82     scanf("%lld",&CASE);
 83     while(CASE--){
 84         scanf("%lld%lld%lld",&n,&m,&r);
 85         for(ll i=0;i<n;++i)
 86             for(ll j=0;j<m;++j)
 87                 scanf("%lld",&mp[i][j]);
 88         for(ll i=0;i<r;++i){
 89             scanf("%lld%lld",&a[i].X,&a[i].Y);
 90             scanf("%lld%lld",&b[i].X,&b[i].Y);
 91             a[i].X--,a[i].Y--,b[i].X--,b[i].Y--;
 92             scanf("%lld%lld",&t[i],&p[i]);
 93         }
 94         scanf("%lld%lld",&S.X,&S.Y);
 95         scanf("%lld%lld",&T.X,&T.Y);
 96         S.X--,S.Y--,T.X--,T.Y--;
 97         init();
 98         ll ans=dijkstra(S.X*m+S.Y,T.X*m+T.Y)/2;
 99         printf("%lld\n",ans);
100     }
101 }

转载于:https://www.cnblogs.com/barrier/p/6756159.html

XDOJ 1202: The Offer - Lunatic相关推荐

  1. xdoj 1202 The Offer - Lunatic

    初看这道题,就是想到bfs呗,结果发现会超时,因为传送门那一块不太好处理.后来发现高度竟然只有100,那枚举高度建点即可.然后就是普通的最短路计算了. #include<cstdio> # ...

  2. 【xdoj难题集】1202 The Offer - Lunatic(附优化版)

    说实话2017年的校赛挺难的,最后三道都不简单,这道题一开始吓了我一大跳,想着如果用最短路算法,魔法阵怎么也要上千万条路径,不过之后看到海拔最高只有100之后总算是安心了. 先说一说大体思路,首先肯定 ...

  3. 一文全搞定:应届生offer,三方,劳动合同区别与注意事项

    文章目录 1 offer,三方,劳动合同是什么? 1.1 offer 1.2 三方协议 1.3 劳动合同 1.4 三者区别与联系 2 签订三方の注意事项 2.1 户口 2.2 工作内容 2.3 培训 ...

  4. 中信银行总行信息科技部笔试面试以及最后拿offer经历

    中信银行 提交简历 19年的招聘网站十分垃圾,提交只能用IE,感觉今年的招聘官网十分不错(ps:开发招聘官网的团队刚好去实习过一段时间,氛围不错,想了解的,可以介绍下的) 笔试 内容多,一般可能确实还 ...

  5. xdoj(1187~1195 )Orz熊猫杯。

    这个月好多事啊马上四级,ccf,选修的大作业,两次数据结构上机报告,物理实验考试,以及这个月过去的马上就到了期末考试了.usaco暂时有空就刷没空就不刷了. 上个星期日学校Oj上搞了一个比赛Orz熊猫 ...

  6. java sip 携带sdp_SIP中的SDP offer/answer交换初探

    1.早期媒体 无论是在PSTN还是在VoIP网络中,一个呼叫的最终目的让两个用户进行交谈(conversation).这里我们将由用户之间的交谈所产生的媒体称为常规媒体("regular m ...

  7. 【剑指offer】顺时针打印矩阵

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26053049 剑指offer上的第20题,九度OJ上測试通过. 题目描写叙述: 输入一个矩 ...

  8. Git error: Unable to negotiate with X.X.X.X : no matching host key type found . their offer: ssh-dss

    2019独角兽企业重金招聘Python工程师标准>>> I am trying to create a git repository on my web host and clone ...

  9. HDU-1203 I NEED A OFFER!-0、1背包及空间优化

    I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

最新文章

  1. 漫画:设计模式之 “外观模式”
  2. DNS隧道工具dns2tcp
  3. 项目经验—Skype客户端内网无法共享PPT
  4. 蓝桥备赛第四周 同余+并查集
  5. oracle视图能用etl工具_今日干货:口碑最好的五款BI工具
  6. 我的世界linux服务器乱码,我的世界服务器控制台使用上箭头乱码解决办法
  7. Spark 集群安装
  8. 编写你的第一个Django应用程序
  9. 机器学习之问题建模(一)
  10. 代码整洁之道 python_Python代码整洁之道:编写优雅的代码
  11. html涟漪动画效果,css3点击显示涟漪特效
  12. WPS Word 快捷键大全
  13. bib文件引用参考文献方法--心得
  14. 怎么把手机便签图片上的文字转换成可以编辑的文字?
  15. 计算机设备名称在哪里找,如何查看电脑驱动
  16. mong大牛的blog
  17. html使div内部元素水平排列_实现元素水平排列的六种方法
  18. dwz交互式弹窗处理
  19. html仪表盘模版,【Minton v1.0.0】管理后台仪表盘HTML5模板
  20. 淘宝主图SKU图采集下载

热门文章

  1. 思维模型 STAR原则
  2. mel表达式_MEL语法
  3. AutoFlowLayout的报错处理
  4. 海思平台OSD的实现(2)
  5. 大学4年里要读的100本书
  6. python中sleep的用法_Python sleep 用法 原
  7. 悟透JavaScript------------有所感。
  8. ASP.NET失物招领网站包含(寻物启事+感谢信+通知公告)c#开发
  9. 飞鱼48小时游戏创作嘉年华_厦门Pitch Time总结与收获
  10. 【专题】莫比乌斯反演