【CF】codeforces_1301F_Super Jaber_最短路

题面

codeforces1301F

题解

  • 这题是道简单题
  • 两种走路方式
    • 莽过去,走曼哈顿距离
    • 用超能力。那肯定是三段:先到一个颜色,从这个颜色到另一个颜色,从另一个颜色到目标。其中每一段都可能退化。
  • 我们要算三种:曼哈顿距离,一个点到一种颜色,一种颜色到一种颜色。
  • 第一个随便算,第二种扫四遍,第三种在第二种的基础上Floyd
  • 这种玩意儿会出什么问题那?反正我是溢出了一位。

代码

#include<bits/stdc++.h>
#define LL long long
#define MAXN 1010
#define MAXK 41
using namespace std;
template<typename T>void Read(T &cn)
{
    char c;int sig = 1;
    while(!isdigit(c = getchar()))if(c == '-')sig = -1; cn = c-48;
    while(isdigit(c = getchar()))cn = cn*10+c-48; cn*=sig;
}
template<typename T>void Write(T cn)
{
    if(cn < 0) {putchar('-'); cn = 0-cn; }
    int wei = 0; T cm = 0; int cx = cn%10; cn/=10;
    while(cn)cm = cm*10+cn%10,cn/=10,wei++;
    while(wei--)putchar(cm%10+48),cm/=10;
    putchar(cx+48);
}
template<typename T>void Min(T &cn, T cm) {cn = cn < cm ? cn : cm; }
template<typename T>void Max(T &cn, T cm) {cn = cn < cm ? cm : cn; }
int n,m,k,q;
int col[MAXN+1][MAXN+1];
int ju[MAXN+1][MAXN+1][MAXK+1];
int a[MAXK*2+1][MAXK*2+1];
void nong(int cn1,int cn2,int cm1,int cm2,int ci1,int ci2)
{
    for(int i = cn1;i!=cn2;i+=ci1) for(int j = cm1;j!=cm2;j+=ci2)
    {
        for(int ij = 1;ij<=k;ij++) Min(ju[i][j][ij], min(ju[i][j-ci2][ij], ju[i-ci1][j][ij])+1);
    }
}
int main()
{
    Read(n); Read(m); Read(k);
    for(int i = 0;i<=n+1;i++) for(int j = 0;j<=m+1;j++) for(int ij = 1;ij<=k;ij++) ju[i][j][ij] = 100000000;
    for(int i = 1;i<=n;i++) for(int j = 1;j<=m;j++) Read(col[i][j]), ju[i][j][col[i][j]] = 0;
    nong(1,n+1,1,m+1,1,1); nong(1,n+1,m,0,1,-1);
    nong(n,0,1,m+1,-1,1); nong(n,0,m,0,-1,-1);
    for(int i = 1;i<=k*2;i++) for(int j = 1;j<=k*2;j++) a[i][j] = k*3+m+n+1;
    for(int i = 1;i<=n;i++) for(int j = 1;j<=m;j++) for(int ij = 1;ij<=k;ij++) Min(a[col[i][j]+k][ij], ju[i][j][ij]);
    for(int i = 1;i<=k;i++) a[i][i+k] = 1, a[i][i] = a[i+k][i+k] = 0;
    for(int ij = 1;ij<=k*2;ij++)
    for(int i = 1;i<=k*2;i++)
    for(int j = 1;j<=k*2;j++)
    Min(a[i][j], a[i][ij] + a[ij][j]);
    Read(q);
    for(int i = 1;i<=q;i++)
    {
        int bx1, by1, bx2, by2;
        Read(bx1); Read(by1); Read(bx2); Read(by2);
        int ans = abs(bx1-bx2) + abs(by1-by2);
        for(int j = 1;j<=k;j++) for(int ij = 1;ij<=k;ij++) Min(ans, ju[bx1][by1][j] + ju[bx2][by2][ij] + a[j][ij+k]);
        Write(ans); puts("");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/czyarl/p/12397558.html

时间: 2024-10-10 20:55:07

【CF】codeforces_1301F_Super Jaber_最短路的相关文章

CF 241E flights 最短路,重复迭代直到稳定 难度:3

http://codeforces.com/problemset/problem/241/E 首先检测哪些点会出现在从起点到终点的路上,可以用dfs或者迭代, 然后,对于所有的边,设f为边起点,t为边终点,dp[i]为从起点出发到i点所必须花费的时间,则当dp[t]>dp[f]+2,也就是超出限制时,把dp[t]限制到dp[f]+2处,对于dp[f]>dp[t]+1,限制dp[f]到dp[t]+1处 因为这个图没有圈,所以如果存在满足题意的边权方案,那么每次使得一个点的dp值满足要求,n次之后

hdoj 1385Minimum Transport Cost

卧槽....最近刷的cf上有最短路,本来想拿这题复习一下.... 题意就是在输出最短路的情况下,经过每个节点会增加税收,另外要字典序输出,注意a到b和b到a的权值不同 然后就是处理字典序的问题,当松弛时发现相同值的时候,判断两条路径的字典序 代码 #include "stdio.h" const int MAXN=110; const int INF=10000000; bool vis[MAXN]; int pre[MAXN]; int cost[MAXN][MAXN],lowcos

CF 505B Mr. Kitayuta&#39;s Colorful Graph(最短路)

题意  求两点之间有多少不同颜色的路径 范围比较小  可以直接floyd #include<cstdio> #include<cstring> using namespace std; const int N = 105; int d[N][N][N], ans; int main() { int a, b, c, n, m, q; while(~scanf("%d%d", &n, &m)) { memset(d, 0, sizeof(d));

CF 144D Missile Silos [最短路+想法]

题意: 给出一张图和图上的一个顶点,求距离这个点距离为s(最短距离)的顶点或边上的点总共有几个(边上的点要保证也是最短距离) 分析: 先用DIJ求出最短路 然后对所有顶点,距离为s的点都算上 枚举每条边 边上的两个顶点如果距离不够,则看在边上能不能找到一个点,顶点上的距离加上这个顶点到点的距离能为s(注意保证这个距离是最小距离(即这个点通过另外一端的顶点距离源点的距离小大于这个s)).数出这样的点的个数,加上.注意重合点的情况,有的边上一个这样的点都没有,有的只有1个,有的有两个点,有的两个点重

Codeforces Round #257 div.2 D or 450D Jzzhu and Cities【最短路】

Codeforces Round #257 div.2 D or 450D Jzzhu and Cities[最短路] 题目链接:点击打开 题目大意: 在一个国家中有n个城市(城市编号1~n),m条公路和k条铁路,编号为1的城市为首都,为了节约,不需要的铁路需要关闭,问在保证首都到其余所有城市的最短路不变的条件下,最多有多少条铁路是不需要的. 解法: 这个题比较麻烦,保证首都到其余城市的最短路不变,要求出最多有多少条铁路是不需要的,那肯定是从最短路的代码上下手了,我们首先考虑dijkstra算法

【打CF,学算法——二星级】CF 520B Two Buttons

[CF简单介绍] 提交链接:Two Buttons 题面: B. Two Buttons time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Vasya has found a strange device. On the front panel of a device there are: a red button, a blu

Codeforces Round #Pi (Div. 2) E. President and Roads (最短路+强连通求割边)

题目地址:codeforces #pi (DIV2) E 题目很水..就是先求两边最短路,然后把可能为最短路的边挑出来,然后判断是否yes只需要转化成无向图跑一遍tarjan,找出割边,割边就是yes,然后剩下的边就让它的值为最短路-1就行了,如果-1后变成了非正数,就是no. 但是!!!居然卡spfa!!那是不是说cf以后就不能用可以卡的算法了..完全可以出组数据来卡这些算法...比如spfa,isap... 于是为了这题,又看了一遍迪杰斯特拉算法.. 代码如下: #include <cstd

【CF】Codeforces Round #361 (Div. 2)

难得有想法写一整套题解 首先想说的是,这场CF,我感觉是div2极为不错的一场(对于中档选手<因为我就出了三题,还掉了一个-- 说笑了,感觉这一场很耐人寻味.就是那种抓破头皮想不出,知道做法后细细品味,有种   哦~~~~~这样啊~~~~好神奇!!! 的感觉 首先..秀一下战绩 不多说了 都在题里 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ A. Mike and Cellphone time limit per test 1 second memory limit per test 256 megaby

Codeforces Round #303 (Div. 2) E. Paths and Trees (最短路+变形最小生成树)

题目地址:E. Paths and Trees 模拟了一场CF,这场实在太水了..边玩边做的..最后半分钟交了一发E题..不幸AK绝杀失败.... 首先的思路肯定是先求最短路,把可能为最短路的边挑出来,然后第二步我本来写的是直接用无向图的最小生成树,于是绝杀失败...后来才发现这样是不行的..因为边是有向边,而且每个点的入度要保证只有一个才行.于是我就把最小生成树的边弄成有向边,然后判定一下每个点的入度保证为1.然后就过了.. 代码如下: #include <iostream> #includ