zoukankan      html  css  js  c++  java
  • [日常摸鱼]luogu1613跑路

    新年A的第一道题2333

    https://www.luogu.org/problemnew/show/P1613

    题意:给一张有向图,每条边长为1,每个单位时间只能走$2^k$的长度,$k$可以任意选,问从起点到终点的最短时间


    我好菜呀一看到题还是不会做orz

    我们用一个$G[i][j][k]$数组来表示$i$到$j$是否存在$2^k$的路径,用$dis[i][j]$表示$i$到$j$需要的最短时间,有连边的两个点就直接让$G[i][j][0]=1,dis[i][j]=1$,然后类似倍增那样子去更新所有节点,最后跑一遍Floyd

    (比较短就不折了x)

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N=55;
    int n,m;
    int dis[N][N];
    bool G[N][N][70];
    
    int main()
    {
        scanf("%d%d",&n,&m);
        memset(dis,10,sizeof(dis));
        for(register int i=1;i<=m;i++)
        {
            int u,v;scanf("%d%d",&u,&v);
            dis[u][v]=1;G[u][v][0]=1;
        }
        for(register int k=1;k<=64;k++)
            for(register int i=1;i<=n;i++)
                for(register int t=1;t<=n;t++)
                    for(register int j=1;j<=n;j++)
                        if(G[i][t][k-1]&&G[t][j][k-1])
                        {
                            G[i][j][k]=1;dis[i][j]=1;
                        }
                    
        for(register int k=1;k<=n;k++)
            for(register int i=1;i<=n;i++)
                for(register int j=1;j<=n;j++)
                    dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
                    
        printf("%d",dis[1][n]);
        return 0;
    }
  • 相关阅读:
    Hibernate核心接口和类
    Struts 2基础知识
    博客开篇
    程序员的幽默笑话(深意爆笑)
    追MM的各种算法
    全局css(慕课)
    全局css
    目录的分层
    class 设置多个css属性
    Python爬虫学习:四、headers和data的获取
  • 原文地址:https://www.cnblogs.com/yoshinow2001/p/8166445.html
Copyright © 2011-2022 走看看