A
题目大意:
给你一个nn的矩阵,矩阵中只有0和1,然后给的k是可以复制2 k^ kk 个所给的nn矩阵。算最短路(0为没路,1为边权为1的路。
思路:
n很小,k很大,复制2k^kk个肯定做不到,猜测只需要原矩阵直接计算最短路,然后查询所输入的点%n。用第一个样例复制一下验证一下猜测:
这是通过Floyd算过的最短路之后的距离矩阵,可见复制的四个方块完全一样。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3fvoid solve()
{int n, k;cin >> n >> k;int a[n][n];memset(a, 0x3f, sizeof a);for(int i = 0; i < n; i ++ )for(int j = 0; j < n; j ++ ){int x;cin >> x;if(x) a[i][j] = x;}//Floydfor(int k = 0; k < n; k ++ )for(int i = 0; i < n; i ++ )for(int j = 0; j < n; j ++ )a[i][j] = min(a[i][j], a[i][k] + a[k][j]);int q;cin >> q;while(q -- ){LL s, t;cin >> s >> t;s --, t --;int tmp = a[s % n][t % n];if(tmp == INF){cout << -1 << endl;}else{cout << tmp << endl;}}
}signed main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int t = 1;// cin >> t;while(t -- ) solve(); system("pause"); return 0;
}