P1613-跑路【Floyd,倍增】
生活随笔
收集整理的這篇文章主要介紹了
P1613-跑路【Floyd,倍增】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.luogu.org/problem/P1613
題目大意
詢問111到nnn的路徑,每次可以走2n2^n2n條邊,求最少次數(可以重復)。
解題思路
定義geti,j,tget_{i,j,t}geti,j,t?表示iii到jjj是否有2t2^t2t的路徑。
然后geti,j,t=geti,k,t?1&getk,j,t?1get_{i,j,t}=get_{i,k,t-1}\&get_{k,j,t-1}geti,j,t?=geti,k,t?1?&getk,j,t?1?
最后跑一遍FloydFloydFloyd即可。
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=51; int n,m,dis[N][N],get[N][N][65]; int main() {scanf("%d%d",&n,&m);memset(dis,0x3f,sizeof(dis));for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);dis[x][y]=1;get[x][y][0]=1;}for(int t=1;t<=64;t++)for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(get[i][k][t-1]&&get[k][j][t-1])get[i][j][t]=1,dis[i][j]=1;for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);printf("%d",dis[1][n]); }總結
以上是生活随笔為你收集整理的P1613-跑路【Floyd,倍增】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蛰伏的意思是什么 蛰伏的详细解释
- 下一篇: P4503-[CTSC2014]企鹅QQ