数据范围,n <= 50
具体看代码吧,倍增其实就是动态规划(目前我见过的来说)
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<vector> using namespace std; typedef long long ll; int flag[70][70][70]; int map[100][100]; int main() { int n, m; scanf("%d%d", &n, &m); memset(map, 0x3f3f3f3f, sizeof(map)); int be, en; for (int i = 0; i < m; i++) { scanf("%d%d", &be, &en); flag[be][en][0] = 1; map[be][en] = 1; } for (int k = 1; k <= 64; k++) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { for (int t = 1; t <= n; t++) { if (flag[i][j][k - 1] && flag[j][t][k - 1]) { flag[i][t][k] = 1; map[i][t] = 1; } } } } } for (int k = 1; k <= n; k++) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { map[i][j] = min(map[i][k] + map[k][j], map[i][j]); } } } printf("%d ", map[1][n]); return 0; }