图论训练之二

https://www.luogu.org/problem/P1613

题目描述

小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零。可是小A偏偏又有赖床的坏毛病。于是为了保住自己的工资,小A买了一个十分牛B的空间跑路器,每秒钟可以跑2^k千米(k是任意自然数)。当然,这个机器是用longint存的,所以总跑路长度不能超过maxlongint千米。小A的家到公司的路可以看做一个有向图,小A家为点1,公司为点n,每条边长度均为一千米。小A想每天能醒地尽量晚,所以让你帮他算算,他最少需要几秒才能到公司。数据保证1到n至少有一条路径。

输入格式

第一行两个整数n,m,表示点的个数和边的个数。

接下来m行每行两个数字u,v,表示一条u到v的边。

输出格式

一行一个数字,表示到公司的最少秒数。

此题就是一个简单的题目描述

小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零。可是小A偏偏又有赖床的坏毛病。于是为了保住自己的工资,小A买了一个十分牛B的空间跑路器,每秒钟可以跑2^k千米(k是任意自然数)。当然,这个机器是用longint存的,所以总跑路长度不能超过maxlongint千米。小A的家到公司的路可以看做一个有向图,小A家为点1,公司为点n,每条边长度均为一千米。小A想每天能醒地尽量晚,所以让你帮他算算,他最少需要几秒才能到公司。数据保证1到n至少有一条路径。

输入格式

第一行两个整数n,m,表示点的个数和边的个数。

接下来m行每行两个数字u,v,表示一条u到v的边。

输出格式

一行一个数字,表示到公司的最少秒数。

最短路+倍增处理

话不多讲,见代码

code by std(简单就懒得写了)

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long read()
{
    long long x=0,f=1; char c=getchar();
    while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
    while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    return x*f;
}
const int N=50+10;
const int K=65+10;
int f[N][N][K],dis[N][N],n,m;
int main()
{
    n=read(),m=read();
    memset(dis,0x3f,sizeof dis);
    for(int i=1;i<=m;i++)
    {
        int s=read(),t=read();
        f[s][t][0]=1;
        dis[s][t]=1;
    }
    for(int o=1;o<=64;o++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                for(int k=1;k<=n;k++)
                    if(f[j][i][o-1]==true and f[i][k][o-1]==true)
                    {
                        f[j][k][o]=true;
                        dis[j][k]=1;
                    }

    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++)
                dis[j][k]=min(dis[j][k],dis[j][i]+dis[i][k]);

    printf("%d",dis[1][n]);
    return 0;
}

原文地址:https://www.cnblogs.com/wzxbeliever/p/11623545.html

时间: 2024-10-11 02:07:00

图论训练之二的相关文章

[图论训练]BZOJ 3245: 最快路线【最短路】

Description 精 明的小R每每开车出行总是喜欢走最快路线,而不是最短路线.很明显,每条道路的限速是小R需要考虑的关键问题.不过有一些限速标志丢失了,于是小R将不知 道能开多快.不过有一个合理的方法是进入这段道路时不改变速度行驶.你的任务就是计算从小R家(0号路口)到D号路口的最快路线. 现在你得到了这个城市的地图,这个地图上的路都是单向的,而且对于两个路口A和B,最多只有一条道路从A到B.并且假设可以瞬间完成路口的转弯和加速. Input 第一行是三个整数N,M,D(路口数目,道路数目

图论训练之七

https://nanti.jisuanke.com/t/A1108 本题又叫缺点最短路,数据卡的很好, 一N×N×N×N恰好过不了 二N×N×N×logN才行 如果一的话就可以再在floyed的基础上多枚举一维 这一维表示不经过该点 floyed的本质是一个增量算法,最外一维枚举的是k,但这个顺序并不影响最后的结果 如果可以处理处对于每个点Y,只剩Y没在floyed的转移矩阵里, 这个矩阵的值就是不经过 y 点的全源最短路 考虑分治, 为什么要分治呢 因为一算法的不好在于每次排除一个点都要所有

Python图论算法(二)——prim算法

算法的思想就不多说了.主要对代码解释一下. graph = [[0,4,3,2], [4,0,1,4], [3,1,0,2], [2,4,2,0]] n = 4 flags = [True,True,True,True] queue = [] #flags是存储节点访问情况的,true为待访问节点 #queue存储节点访问顺序 queue.append(0) flags[0] = False <pre name="code" class="python">

[图论训练]1143: [CTSC2008]祭祀river 二分图匹配

Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在 水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河道连接着两个岔口,并且水在河道内按照一个固定的 方向流动.显然,水系中不会有环流(下图描述一个环流的例子). 由于人数众多的原因,Y族的祭祀活动会在多个岔口上同时举行.出于对龙王的尊重,这些祭祀地点的选择必须非常慎重.准确地说,Y族人认为,如果水流 可以从一个祭祀点流到另外一个祭祀点

[图论训练]BZOJ 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路【floyd】

Description 农夫约翰正驾驶一条小艇在牛勒比海上航行. 海上有N(1≤N≤100)个岛屿,用1到N编号.约翰从1号小岛出发,最后到达N号小岛.一 张藏宝图上说,如果他的路程上经过的小岛依次出现了 Ai,A2,…,AM(2≤M≤10000)这样的序列(不一定相邻),那他最终就能找到古老的宝藏.  但是,由于牛勒比海有海盗出没.约翰知道任意两 个岛屿之间的航线上海盗出没的概率,他用一个危险指数Dij(0≤Dij≤100000)来描述.他希望他的寻宝活动经过的航线危险指数之和最小.那么, 在

图论训练

Light OJ 1002 - Country Roads 1.Dijkstra 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int N=555; 5 int d[N]; 6 bool vis[N]; 7 const int INF=0x3f3f3f3f; 8 vector < pair<int,int> > E[N]; 9 10 void init(){ 11 for(int i=0;i<

算法训练(二)

1.zoj-4049 简单的进程模拟,大部分情况下可以直接出答案,当进入死循环的时候,不难发现,循环中所得值会出现重复,因此可视重复为死循环的标志,使用一个bool数组进行标记即可,代码如下: #include <iostream> #include<cstring> using namespace std; const int N = 10100; const int Mod = 256; bool dp[N][257]; struct node { char op[4]; in

图论训练之一

noip水题系列 https://www.luogu.org/problem/P1027 题目明显就是一个多组数据(也就<=10)单源最短路, 这里可以就不用floyed 但你会发现它是道蓝题也是有一定道理的 你会很恼火它的建边: 使用勾股定理加一系列的特判,而且又是浮点数 话不多述, 思路简单,代码麻烦,就把题解修改一下搬过来了 code: #include <cstdio> #include <cmath> #include <cstring> #includ

杂题训练之二

https://www.luogu.org/problem/P4147 其实和最大子矩阵的思路特别像 可以用悬线法,也可以用单调栈, 因为前文我写过悬线法,所有,这里就用单调栈写 因为单调栈是模板,,手动模拟一下就可以写出来的 所以不提供讲解只提供代码 code: #include<cstdio> #include<bits/stdc++.h> using namespace std; int a[1001][1001]; int s[1001],l[1001]; int n,m,