题面

题解

我们可以总结出球的两种状态,要么自己飞,要么在球员脚下被带飞。

自己飞的情况下,他只能单向直线运动,每一步代价为A,被带飞可以乱走,每一步代价为C。

从自己飞到被带飞需要一个距离自己最近的球员过来,代价为 ,对于每个格点,这个代价都是确定的,因为球不可能两次到同一个球员脚下,所以球员就相当于一次性的工具人,输入后bfs处理 就可以了。

从被带飞到自己飞需要踢一脚,给它自由,代价为B。

那么我们可以把每个格点拆成5个点,然后建个图。

自己飞要四个点,分别表示四个方向,每个点朝那个方向的下一个同类点连一条单向边,权值为A,这样就可以模拟出单向运动了。

被带飞就需要单独一个点,向四个方向的带飞点连双向边,权值为C,这样球就可以乱走了。

自己飞的四个点向被带飞的一个点分别连一条单向边,权值为 ,表示球员跑过来,把它带飞。

被带飞的一个点向自己飞的四个点分别连一条单向边,权值为 B,表示分别向四个方向踢一脚的情况。

这样就可以直接求最短路了。

不推荐用 Slow Path Finding Algorithm。

CODE

注意,实际行数列数是 ≤ 501 的,总共有 251001 个点,特别坑

#include<cstdio>
#include<cstring>
#include<vector>
#include<stack>
#include<queue>
#include<algorithm>
#include<map>
#include<set>
#include<cmath>
#include<bitset>
#include<iostream>
#define MAXN 251010
#define LL long long
#define ULL unsigned LL
#define rg register
#define lowbit(x) (-(x) & (x))
#define ENDL putchar('\n')
#define DB double
#define bs bitset<105>
//#pragma GCC optimize(2)
//#pragma G++ optimize(3)
//#define int LL
using namespace std;
char char_read_before = 1;
inline int read() {
int f = 1,x = 0;char s = char_read_before;
while(s < '0' || s > '9') {if(s == '-') f = -1;s = getchar();}
while(s >= '0' && s <= '9') {x = x * 10 - '0' + s;s = getchar();}
char_read_before = s;return x * f;
}
template<typename T__>
inline T__ Abs(T__ x) {return x < 0 ? -x:x;}
int zxy; // 用来膜的
int n,m,i,j,s,o,k,h,w,N,S,T;
int x[MAXN],y[MAXN];
int dpp[505][505];
bool v[505][505];
int dx[4] = {0,0,-1,1};
int dy[4] = {-1,1,0,0};
struct itn{
int x,y,s;
itn(){x=y=s=0;}
itn(int X,int Y,int S){x=X;y=Y;s=S;}
};
queue<itn> b;
int L,R,U,D;
LL A,B,C;
struct it{
int v;
LL w;
it(){v=w=0;}
it(int V,LL W){v = V;w = W;}
};
vector<it> g[MAXN*5];
LL dp[MAXN*5] = {(LL)1e18};
bool f[MAXN*5];
inline int I(int x,int y) {return (x-1)*w + y;}
inline int bing(int a,int b) {return dp[a] < dp[b] ? a:b;}
int tre[MAXN*20],M;
inline void mt(int n){M=1;while(M < n+2) M <<= 1;}
inline void addt(int x,int y) {
int s = M+x;tre[s] = y;s >>= 1;
while(s) tre[s] = bing(tre[s<<1],tre[s<<1|1]),s >>= 1;
}
inline int allt() {return tre[1];}
void dij() {
mt(N*5);
dp[S] = 0;
addt(S,S);
for(int i = 1;i < N*5;i ++) {
int t = allt();
if(!t) break;
f[t] = 1;
for(int j = 0;j < g[t].size();j ++) {
if(!f[g[t][j].v]) {
dp[g[t][j].v] = min(dp[g[t][j].v],dp[t] + g[t][j].w);
addt(g[t][j].v,g[t][j].v);
}
}
addt(t,0);
}
}
signed main() {
h = read()+1;w = read()+1;
N = h*w;
A = read();B = read();C = read();
n = read();
for(int i = 1;i <= n;i ++) {
x[i] = read()+1;y[i] = read()+1;
dpp[x[i]][y[i]] = 0;
v[x[i]][y[i]] = 1;
b.push(itn(x[i],y[i],0));
}
while(!b.empty()) {
itn t = b.front();
b.pop();
for(int i = 0;i < 4;i ++) {
itn t1(t.x + dx[i],t.y + dy[i],t.s + 1);
if(t1.x < 1 || t1.y < 1 || t1.x > h || t1.y > w || v[t1.x][t1.y]) continue;
dpp[t1.x][t1.y] = t1.s;
v[t1.x][t1.y] = 1;
b.push(t1);
}
}
S = I(x[1],y[1])+4*N;
T = I(x[n],y[n])+4*N;
for(int i = 1;i <= h;i ++) {
for(int j = 1;j <= w;j ++) {
LL pd = dpp[i][j]*C;
int d1 = I(i,j),d2 = d1 + N,d3 = d2 + N,d4 = d3 + N,d5 = d4 + N;
dp[d1] = dp[d2] = dp[d3] = dp[d4] = dp[d5] = (LL)1e17;
if(i > 1) {
g[d1].push_back(it(I(i-1,j),A));
g[d5].push_back(it(I(i-1,j)+4*N,C));
}
if(i < h) {
g[d2].push_back(it(I(i+1,j)+N,A));
g[d5].push_back(it(I(i+1,j)+4*N,C));
}
if(j > 1) {
g[d3].push_back(it(I(i,j-1)+2*N,A));
g[d5].push_back(it(I(i,j-1)+4*N,C));
}
if(j < w) {
g[d4].push_back(it(I(i,j+1)+3*N,A));
g[d5].push_back(it(I(i,j+1)+4*N,C));
}
g[d1].push_back(it(d5,pd));
g[d2].push_back(it(d5,pd));
g[d3].push_back(it(d5,pd));
g[d4].push_back(it(d5,pd)); g[d5].push_back(it(d1,B));
g[d5].push_back(it(d2,B));
g[d5].push_back(it(d3,B));
g[d5].push_back(it(d4,B));
}
}
dij();
printf("%lld\n",dp[T]);
return 0;
}

[JOI 2017 Final] 足球 (建图,最短路)的更多相关文章

  1. 「JOI 2017 Final」JOIOI 王国

    「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 H ...

  2. 【题解】LOJ2759. 「JOI 2014 Final」飞天鼠(最短路)

    [题解]LOJ2759. 「JOI 2014 Final」飞天鼠(最短路) 考虑最终答案的构成,一定是由很多飞行+一些上升+一些下降构成. 由于在任何一个点上升或者下降代价是一样的,所以: 对于上升操 ...

  3. uva10067 Playing with Wheels 【建图+最短路】

    题目:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1008">uva10067 Play ...

  4. 【建图+最短路】Bzoj1001 狼抓兔子

    Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...

  5. CodeForces 786B Legacy(线段树优化建图+最短路)

    [题目链接] http://codeforces.com/problemset/problem/786/B [题目大意] 给出一些星球,现在有一些传送枪,可以从一个星球到另一个星球, 从一个星球到另一 ...

  6. 【转】Codeforces Round #406 (Div. 1) B. Legacy 线段树建图&&最短路

    B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...

  7. G. 神圣的 F2 连接着我们 线段树优化建图+最短路

    这个题目和之前写的一个线段树优化建图是一样的. B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路 之前这个题目可以相当于一个模板,直接套用就可以了. 不 ...

  8. 【SDOI2017】天才黑客(前后缀优化建图 & 最短路)

    Description 给定一张有向图,\(n\) 个点,\(m\) 条边.第 \(i\) 条边上有一个边权 \(c_i\),以及一个字符串 \(s_i\). 其中字符串 \(s_1, s_2, \c ...

  9. BZOJ 4289: PA2012 Tax 差分建图 最短路

    https://www.lydsy.com/JudgeOnline/problem.php?id=4289 https://www.cnblogs.com/clrs97/p/5046933.html  ...

随机推荐

  1. 【Azure 应用服务】NodeJS Express + MSAL 实现API应用Token认证(AAD OAuth2 idToken)的认证实验 -- passport.authenticate('oauth-bearer', {session: false})

    问题描述 在前两篇博文中,对NodeJS Express应用 使用MSAL + AAD实现用户登录并获取用户信息,获取Authorization信息 ( ID Token, Access Token) ...

  2. Java-调用R语言和调用Python(前后端展示)

    1. 背景 R语言和Python用于数据分析和数据处理,并生成相应的直方图和散点图 需要实现一个展示平台,后端使用Java,分别调用R语言和调用Python,并返回数据和图给前端显示 这个平台主要实现 ...

  3. 过年了,基于Vue做一个消息通知组件

    前言 今天除夕,在这里祝大家新年快乐!!!今天在这个特别的日子里我们做一个消息通知组件,好,我们开始行动起来吧!!!项目一览 效果很简单,就是这种的小卡片似的效果. 我们先开始写UI页面,可自定义消息 ...

  4. Error: $controller:ctrlreg A controller with this name is not registered.

    The controller with the name 'SomeController' is not registered.名称为'SomeController'的控制器没注册 : Descrip ...

  5. Operator介绍

    一.Operator简介 在Kubernetes中我们经常使用Deployment.DaemonSet.Service.ConfigMap等资源,这些资源都是Kubernetes的内置资源,他们的创建 ...

  6. mysql-安装(windows版本)与登录

    安装mysql 1.MySQL版本 mysql-5.6.35-winx64.zip 2.首先解压到安装目录 3.修改配置文件 复制my-default.ini 重命名为my.ini 然后修改mysql ...

  7. 通过input的name属性取值

    HTML中 Script中 根据选中的值,res也就拿到相应的值.

  8. RASP | 远程Java应用的RASP调试教程

    远程Java应用的RASP调试教程 介绍 Java RASP是基于Java Agent技术实现的,而Java Agent代码无法独立启动,必须依赖于一个Java运行时程序才能运行. 如何调试一个Jav ...

  9. SpringCloud微服务实战——搭建企业级开发框架(四十三):多租户可配置的电子邮件发送系统设计与实现

      在日常生活中,邮件已经被聊天软件.短信等更便捷的信息传送方式代替.但在日常工作中,我们的重要的信息通知等非常有必要去归档追溯,那么邮件就是不可或缺的信息传送渠道.对于我们工作中经常用到的系统,里面 ...

  10. vscode的安装、切换为中文简体、集成sass

    VScode设置中文 打开vscode ,按快捷键"Ctrl+Shift+P" 输入configure language,回车 选择安装其他语言 (默认是英文的) 选择简体中安装( ...