码迷,mamicode.com
首页 > 其他好文 > 详细

[日常摸鱼]luogu1613跑路

时间:2018-01-01 12:27:48      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:www   turn   str   i++   string   起点   color   org   body   

新年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;
}

 

[日常摸鱼]luogu1613跑路

标签:www   turn   str   i++   string   起点   color   org   body   

原文地址:https://www.cnblogs.com/yoooshinow/p/8166445.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!