新年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; }
原文地址:https://www.cnblogs.com/yoooshinow/p/8166445.html
时间: 2024-11-05 20:36:25