A
题目大意:
给你一个nn的矩阵,矩阵中只有0和1,然后给的k是可以复制2 k ^ k k 个所给的nn矩阵。算最短路(0为没路,1为边权为1的路。
思路:
n很小,k很大,复制2 k ^k k个肯定做不到,猜测只需要原矩阵直接计算最短路,然后查询所输入的点%n。用第一个样例复制一下验证一下猜测:
这是通过Floyd算过的最短路之后的距离矩阵,可见复制的四个方块完全一样。
AtCoder Regular Contest 159(A)-LMLPHP

#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;
}
04-10 06:18