A
题目大意:
给你一个nn的矩阵,矩阵中只有0和1,然后给的k是可以复制2 k ^ k k 个所给的nn矩阵。算最短路(0为没路,1为边权为1的路。
思路:
n很小,k很大,复制2 k ^k k个肯定做不到,猜测只需要原矩阵直接计算最短路,然后查询所输入的点%n。用第一个样例复制一下验证一下猜测:
这是通过Floyd算过的最短路之后的距离矩阵,可见复制的四个方块完全一样。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
void 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;
}
//Floyd
for(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;
}