洛谷P1613 跑路

这么简单的题都想了半天,肯定是智商低

看起来对Floyd的掌握还不够熟练呢

总之,把2^k的状态扔在最外围循环就ok了

// luogu-judger-enable-o2
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 50 + 2;

int N, M;
bool d[MAXN][MAXN][63];
int f[MAXN][MAXN];

int main()
{
    cin>>N>>M;memset(f, 0x3f, sizeof(f));
    for(int i = 1, u, v; i <= M; i++){
        scanf("%d%d", &u, &v);
        d[u][v][0] = 1, f[u][v] = 1;
    }
    
    for(int p = 1; p < 63; p++)
        for(int k = 1; k <= N; k++)
            for(int i = 1; i <= N; i++)
                for(int j = 1; j <= N; j++)
                    if(d[i][k][p - 1] && d[k][j][p - 1])
                        d[i][j][p] = 1, f[i][j] = 1;
    
    for(int k = 1; k <= N; k++)
        for(int i = 1; i <= N; i++)
            for(int j = 1; j <= N; j++)
                    f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
    cout<<f[1][N]<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/wsmrxc/p/9291737.html