arc159a

题目链接:https://atcoder.jp/contests/arc159/tasks/arc159_a

打个表可以发现,每一个复制块的的最短路都相等。

思路:对询问的两个值进行取模运算,再到原最短路上进行查询即可。

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int dist[N][N];
void solve(){
    int n,m;
    cin>>n>>m;
    memset(dist,0x3f,sizeof(dist));
    for (int i=1;i<=n;i++){
        for (int j=1;j<=n;j++){
            int x;
            cin>>x;
            if (x) dist[i][j] = 1;
        }
    }
    for (int k=1;k<=n;k++){
        for (int i=1;i<=n;i++){
            for (int j=1;j<=n;j++){
                dist[i][j] = min(dist[i][j],dist[i][k]+dist[k][j]);
            }
        }
    }
    int q;
    cin>>q;
    for (int i=1;i<=q;i++){
        long long x,y;
        cin>>x>>y;
        x = (x%n==0)?n:x%n;
        y = (y%n==0)?n:y%n;
        if (dist[x][y]==0x3f3f3f3f) cout<<-1<<'\n';
        else cout<<dist[x][y]<<'\n';
    }
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T;
    T = 1;
    //cin>>T;
    while(T--) solve();
    return 0;
}

posted @ 2023-04-10 08:31  安潇末痕  阅读(27)  评论(0)    收藏  举报