首页 > 其他分享 >P8312 [COCI2021-2022#4] Autobus floyd最短路

P8312 [COCI2021-2022#4] Autobus floyd最短路

时间:2024-03-29 23:30:54浏览次数:17  
标签:COCI2021 last P8312 int min cin kk floyd now

[P8312 COCI2021-2022#4] Autobus - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路: n n n数据范围很小可以用Floyd算法。注意:最多坐 k k k个不同的公交线路,这个可以考虑用两个二维数组 n o w now now和 l a s t last last分别表示当前得到的最小值和上一次得到的最小值,这样每次跑一次都是只转移一条边,跑 k k k次,除去建边用掉一次,只需要跑 k − 1 k - 1 k−1次即可。

同时发现 k k k很大,但是最多只需要 n n n次即可,故需要取最小值 m i n ( k , n ) min(k,n) min(k,n)之后跑 k − 1 k - 1 k−1次。

代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 21;
int d[N][N], now[N][N], last[N][N];
int main()
{
    int n,m; cin>>n>>m;
    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j <= n; ++j) {
            d[i][j] = (i == j ? 0 : 1e9);
        }
    }
    for(int i = 1; i <= m; ++i) {
        int u,v,w; cin>>u>>v>>w;
        if(u == v) continue;
        d[u][v] = min(d[u][v],w);
    }
    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j <= n; ++j) now[i][j] = d[i][j];
    }
    int k,q; cin>>k>>q;
    int mi = min(k, n);
    for(int k = 2; k <= mi; ++k) {
        for(int i = 1; i <= n; ++i) {
            for(int j = 1; j <= n; ++j) {
                last[i][j] = now[i][j];
            }
        }
        for(int kk = 1; kk <= n; ++kk) {
            for(int i = 1; i <= n; ++i) {
                for(int j = 1; j <= n; ++j) {
                    last[i][j] = min(last[i][j], now[i][kk] + d[kk][j]);
                }
            }
        }
        for(int i = 1; i <= n; ++i) {
            for(int j = 1; j <= n; ++j) {
                now[i][j] = last[i][j];
            }
        }
    }
    while(q--) {
        int u,v; cin>>u>>v;
        if(now[u][v] == 1e9) cout<<-1<<'\n';
        else cout<<now[u][v]<<'\n';
    }
}

标签:COCI2021,last,P8312,int,min,cin,kk,floyd,now
From: https://blog.csdn.net/qq_63432403/article/details/137061851

相关文章

  • Floyd算法 【多源最短路】模板
    B3647【模板】Floyd-洛谷|计算机科学教育新生态(luogu.com.cn)#include<bits/stdc++.h>usingnamespacestd;constintN=1e2+10;constintinf=0x3f3f3f;intn,m;intg[N][N];voidfloyd(){for(intk=1;k<=n;k++){for(inti=1;i<=n;i++)......
  • Floyd&Dijkstra
    拓展,多条路径Floyd算法Floyd算法是一种求解“多源最短路”问题的算法在Floyd算法中,图一般用邻接矩阵存储,边权可正可负(但不允许负环),利用动态规划的思想,逐步求解出任意两点之间的最短距离我们需要准备的东西很少,只需要一个d数组:int[N][N][N],初始为无穷大,无穷大表示两点之间没......
  • Floyd 判圈算法
    概述  Floyd判圈算法又称作是龟兔赛跑算法,就是快慢指针的应用,主要用于判断并找到环形链表的入口。做法是设置两个指针,一个快指针(兔子),一个慢指针(乌龟),快指针一次移动两个节点,慢指针一次移动一个节点。如果有环存在,它们第一次会在环上相遇,这时快指针移动到出发点,转换成慢指针(就是......
  • lgB3647 Floyd最短路
    给出一张由n个点m条边组成的无向图,求所有点对(i,j)之间的最短路。n<=100;m<=4500;1<=w<=1000多源最短路模板题,注意循环顺序是kij,另外可能会有重边,因此两点之间的距离要初始化为inf,读入边权时取最小值。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong......
  • Floyd算法学习笔记
    Floyd算法学习笔记前言如有错误,欢迎各位dalao批评指出。前置芝士:1.邻接矩阵(Floyd要用邻接矩阵存图)2.动态规划思想(最好学过,没学过也没有太大影响)1.Floyd所解决问题的类型我们可以发现,如Dijkstra,SPFA,BellmanFord一类的最短路算法都是解决单源点最短路问题,也就是确......
  • Floyd
    适用于多源汇求最短路的问题原理:基于动态规划AcWing-854ACcode:#include<iostream>#include<algorithm>#include<cstring>usingnamespacestd;constintN=510,INF=1e9;intn,m,Q;intd[N][N];//邻接矩阵voidFloyd(){for(intk=1;k<=n;k++)......
  • 空间转移(dp+倍增+Floyd)
    第2题   空间转移 查看测评数据信息给定一个n个点,m条边的有向图,编号从1到n,所有边权值是1,现在有一个动点从点1开始一动,其每秒钟可以移动2的k次方千米(k是任意自然数,且2的k次方不超过1000000000)。最少需要几秒才能到达n号点。数据保证1到n至少有一条路径。n⩽50,m⩽1000......
  • 全源最短路径——Floyd算法
    目录问题引入思路一览算法原理代码部分问题引入给出一个含有n个点,m条边的图,如何快速的给出任意两个点的最短路径思路一览这个,感觉没啥思路,可能能想到的最暴力的解法就是对每一个点进行dfs遍历,在遍历过程中更新,但是这样的做法肯定是时间复杂度爆炸的;因此还是老算法Floyd香,Floyd......
  • 洛谷题解-P2888 [USACO07NOV] Cow Hurdles S (Floyd)
    https://www.luogu.com.cn/problem/P2888题目描述FarmerJohnwantsthecowstoprepareforthecountyjumpingcompetition,soBessieandthegangarepracticingjumpingoverhurdles.Theyaregettingtired,though,sotheywanttobeabletouseaslittleene......
  • floyd 详解
    解析  模板  第1题    floyd练习查看测评数据信息给定一个n个点m条边的有向图,图中可能存在重边和自环,边权可能为负数。再给定k个询问,每个询问包含两个整数x和y,表示查询从点x到点y的最短距离,如果路径不存在,则输出impossible。数据保证图中不存在......